做完今天的N1,然后发现这不是一样的题目吗???

题意

我们每天可以最多购买m个糖果,连续买 k 个需要额外支付 。保证每天吃一个糖,求买n个糖果的最少代价。

分析

我们定义dp[i][j],表示前i天买了j颗糖的代价。

我们对 m 颗糖可以贪心一下,一定是买更便宜的糖。

然后枚举今天买几颗即可。

然后为了保证每天都有糖吃,第 i 天从 dp[i-1][i-1] 开始转移就行了。

具体看代码实现。

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define int long long
const int inf = 0x3f3f3f3f;
const int maxn = 410;
const int M = 1e9+7;
int n,m,k,ok;

int a[maxn];

int dp[maxn][maxn];

signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>n>>m;
    mem(dp,inf);dp[0][0] = 0;
    for(int i = 1; i <= n; i++) 
    {
        for(int j = 1; j <= m; j++) cin>>a[j];
        sort(a+1,a+1+m);
        for(int k = i-1; k <= n; k++)
        {   
            int sum = 0;
            for(int j = 0; j <= m; j++)
            {   
                sum += a[j];
                dp[i][k+j] = min(dp[i][k+j],dp[i-1][k]+sum+j*j);
            }
        }
    }
    cout<<dp[n][n]<<endl;
    return 0;
}