题意:
某货旅行,在n个城市呆m天。
给出从第i个城市到第j个城市的路费,或者留在某个城市的生活费。
给出在第i天在第j个城市的收益。
可以在城市之间任意穿梭逗留没有其他特殊要求。
求收益最大是多少。
思路:
dp[i][j]代表这货在第i天在第j个城市的最大收益。
然后状态转移方程是dp[i][j]=max(dp[i-1][1..n]+枚举目标城市计算收益)【这里少写了目标城市的那层循环,一共三层循环】
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; int n,m; int take[105][105]; int give[105][105]; int dp[105][105]; int main() { scanf("%d%d",&n,&m); while(n||m) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&take[i][j]); } } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { scanf("%d",&give[i][j]); } } for(int i=1;i<=n;i++) { dp[1][i]=give[1][i]-take[1][i]; } for(int i=2;i<=m;i++) { for(int j=1;j<=n;j++) { int maxn=(-1)*inf; for(int k=1;k<=n;k++) { maxn=max(dp[i-1][k]+give[i][j]-take[k][j],maxn); } dp[i][j]=maxn; } } int ans=(-1)*inf; for(int i=1;i<=n;i++) { ans=max(ans,dp[m][i]); } printf("%d\n",ans); scanf("%d%d",&n,&m); } }
时间: 2024-12-15 19:14:19