题:https://ac.nowcoder.com/acm/contest/6877/A
题意:店每天有m个物品,每个物品都有代价c,现有n天,你每天要用一件。问要如何购买代价最小。且在一天中购买k件会增加代价k^2。
分析:设dp[i][j]表示第 i 天购买了 j 个物品的最小代价,dp[i][j]可由前i-1天买了x个物品(x<=j)加上第 i 天买了j-x个物品转化而来。

#include<bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define lson root<<1,l,midd #define rson root<<1|1,midd+1,r const int inf=0x3f3f3f3f; const ll INF=1e18; const int M=305; const int mod=998244353; ll a[M][M],dp[M][M]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) scanf("%lld",&a[i][j]); sort(a[i]+1,a[i]+1+m); for(int j=1;j<=m;j++) a[i][j]+=a[i][j-1]; } memset(dp,0x3f,sizeof(dp)); dp[0][0]=0; for(int i=1;i<=n;i++) for(int j=i;j<=min(n,i*m);j++){ for(int k=0;k<=j&&k<=min(n,(i-1)*m);k++) dp[i][j]=min(dp[i][j],dp[i-1][k]+a[i][j-k]+(j-k)*(j-k)); } printf("%lld ",dp[n][n]); return 0; }