http://codeforces.com/gym/102056/problem/I
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=110; const int maxm=10000+10; int a[maxn],b[maxn],c[maxn]; ll dp[2][maxn][maxm]; int main() { int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=n;i>=1;i--) scanf("%d %d %d",&a[i],&b[i],&c[i]); for(int j=0;j<=n;j++)for(int k=0;k<=n*n;k++)dp[1][j][k]=-1e18; dp[1][1][1]=a[1]; for(int i=2;i<=n;i++) { for(int j=0;j<=n;j++)for(int k=0;k<=n*n;k++) dp[0][j][k]=dp[1][j][k],dp[1][j][k]=-1e18; for(int j=0;j+1<=n;j++) for(int k=0;k+i<=n*n;k++) dp[1][j+1][k+i]=max(dp[1][j+1][k+i],dp[0][j][k]+a[i]); for(int j=0;j<=n;j++) for(int k=0;k<=n*n;k++) dp[1][j][k]=max(dp[1][j][k],dp[0][j][k]+(ll)c[i]*j), dp[1][j][k]=max(dp[1][j][k],(ll)(i*j-k)*b[i]+dp[0][j][k]); } ll ans=0; for(int i=0;i<=n;i++) for(int j=0;j<=n*n;j++) ans=max(dp[1][i][j],ans); printf("%lld\n",ans); } return 0; }
2018-2019 ACM-ICPC, Asia East Continent Finals I. Misunderstood … Missing(dp)
原文:https://www.cnblogs.com/carcar/p/10746082.html