钓鱼

 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 } 

 

posted @ 2018-09-23 08:01  lcan  阅读(179)  评论(0编辑  收藏  举报