看到题目描述立马蒙了,怎么废话怎么多??不愧是普及组最后一题啊
其实本题不难,理好思路就行了,dp【i】指到了第i个单位时间时最大收益,外层循环时间m,内层枚举起点,再枚举该机器人行走的时间
dp[i]=max(dp[i],dp[i-k]+该时间内总获得的金钱-买机器人时的花费)
1 #include<bits/stdc++.h> 2 #define maxn 1010 3 using namespace std; 4 5 inline int read(){ 6 int x=0,f=1;char ch=getchar(); 7 while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();} 8 while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();} 9 return f*x; 10 } 11 12 int money[maxn][maxn],cost[maxn],n,m,p,dp[maxn]; 13 14 int main(){ 15 n=read();m=read();p=read(); 16 for(int i=1;i<=n;i++) 17 for(int j=1;j<=m;j++) 18 money[i][j]=read(); 19 for(int i=1;i<=n;i++) cost[i]=read(); 20 memset(dp,-0x3f3f3f3f,sizeof(dp));dp[0]=0; 21 for(int i=1;i<=m;i++) 22 for(int j=1;j<=n;j++){ 23 int jj=j,ss=0; 24 for(int k=1;k<=p;k++){ 25 if(k>i) break; 26 jj--;if(!jj) jj=n;ss+=money[jj][i-k+1]; 27 dp[i]=max(dp[i],dp[i-k]+ss-cost[jj]); 28 } 29 } 30 printf("%d",dp[m]); 31 return 0; 32 }