钓鱼
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int maxn=107; 5 int n,h,ans; 6 int f[maxn],d[maxn],t[maxn],dp[maxn][maxn],st[maxn],num[maxn][maxn]; 7 int main(){ 8 cin>>n>>h;h*=12; 9 for(int i=1;i<=n;i++) cin>>f[i]; 10 for(int i=1;i<=n;i++) cin>>d[i]; 11 for(int i=1;i<n;i++) {cin>>t[i];st[i]=st[i-1]+t[i];} 12 for(int i=2;i<=n;i++) {dp[i][st[i-1]]=f[i];num[i][st[i-1]]=1;} dp[1][1]=f[1];num[1][1]=1; 13 for(int j=2;j<=h;j++){ 14 if(f[1]-d[1]*(j-1)<=0) break; 15 dp[1][j]=dp[1][j-1]+f[1]-d[1]*(j-1); 16 } 17 for(int i=2;i<=n;i++){ 18 for(int j=st[i-1];j<=h;j++){ 19 if(dp[i][j]<dp[i-1][j-t[i-1]]+f[i]){ 20 dp[i][j]=dp[i-1][j-t[i-1]]+f[i];num[i][j]=1; 21 22 } 23 for(int k=j-1;k>=1;k--){ 24 int lft=0; 25 for(int u=k;u<=j;u++){ 26 lft+=f[i]-d[i]*num[i][k]*(u-k+1); 27 } 28 if(dp[i][j]<dp[i][k]+lft){ 29 dp[i][j]=dp[i][k]+lft;num[i][j]=num[i][k]+1; 30 cout<<"r2 "<<i<<" "<<j<<" "<<dp[i][j]<<endl; 31 } 32 if(lft-d[i]<0) break; 33 } 34 } 35 } 36 for(int i=1;i<=n;i++){ 37 for(int j=1;j<=h;j++) 38 cout<<dp[i][j]<<" "; 39 cout<<endl; 40 } 41 for(int i=1;i<=n;i++){ 42 for(int j=1;j<=h;j++) 43 ans=max(ans,dp[i][j]); 44 } 45 cout<<ans<<endl; 46 return 0; 47 }