codeforce 590d

思路:從最後一個數開始考慮,是否放入 k-數列 中,因爲後面的數不影響前面的數,並且總步數不超過n*n。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long

int dp[23000][152];
int n,s,m;
int a[151];

int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    s=min(s,n*n);
    memset(dp,0x3f,sizeof(dp));
    dp[0][0]=0;
    for(int i=n;i>=1;i--)
    {
        for(int j=s;j>=0;j--)
        {
            for(int k=m;k>=0;k--)
            {
                if(k-1<0||j-(i-m+k-1)<0)continue;
                dp[j][k]=min(dp[j][k],dp[j-(i-m+k-1)][k-1]+a[i]);
            }
        }
    }
    int ans=999999999;
    for(int i=0;i<=s;i++)
    {
        ans=min(ans,dp[i][m]);
    }
    printf("%d\n",ans);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章