做完今天的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;
} 
京公网安备 11010502036488号