1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int t[30],T[30],f[30],d[30]; int dp[30][300];//dp[i][j]表示钓鱼的范围是1~i, 总时间是j(包含钓鱼和走路的时间) int main() { int n,h;scanf("%d%d",&n,&h);h=h*12; for(int i=1;i<=n;i++) scanf("%d",&f[i]); for(int i=1;i<=n;i++) scanf("%d",&d[i]); t[1]=0;T[1]=0;for(int i=2;i<=n;i++)scanf("%d",&t[i]),T[i]=T[i-1]+t[i]; memset(dp,0,sizeof(dp)); int ans=0; for(int i=1;i<=n;i++) { for(int j=T[i];j<=h;j++) { dp[i][j]=dp[i-1][j-t[i]]; int sfi=0,fi=f[i]; //sfi表示在第i个池塘花k分钟能钓到的鱼的数量 for(int k=1;k<=j-T[i];k++)if(fi>0)//fi表示当前这一分钟能钓到的鱼的数量 { sfi+=fi; dp[i][j]=max(dp[i][j],sfi+dp[i-1][j-t[i]-k]); fi-=d[i]; }else break; } ans=max(ans,dp[i][h]);//答案在dp[i][h]中,而不是只在dp[n][h] } printf("%d\n",ans); return 0; } 【参考程序2】 #include<bits/stdc++.h> using namespace std; int t[30],T[30],f[30],d[30]; int dp[30][300];//dp[i][j]表示钓鱼的范围是1~i, 总时间是j(包含钓鱼和走路的时间) int main() { int n,h;scanf("%d%d",&n,&h);h=h*12; for(int i=1;i<=n;i++) scanf("%d",&f[i]); for(int i=1;i<=n;i++) scanf("%d",&d[i]); t[1]=0;T[1]=0;for(int i=2;i<=n;i++)scanf("%d",&t[i]),T[i]=T[i-1]+t[i]; memset(dp,0,sizeof(dp)); int ans=0; for(int i=1;i<=n;i++) { for(int j=T[i];j<=h;j++) { dp[i][j]=dp[i-1][j-t[i]]; for(int k=1;k<=j-T[i];k++)if(f[i]-(k-1)*d[i]>0) { dp[i][j]=max(dp[i][j],k*(f[i]+f[i]-(k-1)*d[i])/2+dp[i-1][j-t[i]-k]); }else break; } ans=max(ans,dp[i][h]); } printf("%d\n",ans); return 0; }
- 1
信息
- ID
- 247
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 73
- 已通过
- 38
- 上传者