线性dp求出状态转移方程即可
而且里面有一些细节需要注意如他枚举的时候并不是枚举i-n ;j-m应该是j-n因为dp数组第一维的含义是第几天,第二维的含义是买了几个东西
状态转移方程为dp[i][j]=min(dp[i][j],dp[i-1][k]+sum[i][j-k]+(j-k)*(j-k));
#include
using namespace std;
#define int long long
#define endl '\n'
#define YES cout<<"YES"< PII;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
const int N = 1e5+10;
int a[310][310];
int sum[310][310];
int dp[310][310];
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
void solve()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dp[i][j]=0x3f3f3f3f;}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}sort(a[i]+1,a[i]+1+m);for(int k=1;k<=m;k++){sum[i][k]=sum[i][k-1]+a[i][k];}}for (int j = 1;j <= m;j++)dp[1][j] = sum[1][j] + j * j; for(int i=2;i<=n;i++){for(int j=i;j<=n;j++){for(int k=i-1;k<=j;k++){if(j-k<=m){dp[i][j]=min(dp[i][j],dp[i-1][k]+sum[i][j-k]+(j-k)*(j-k));}}}}cout<
下一篇:PMP第十章重要知识点