题意:
给你n个城市m天。
每个城市有到达的花费 c[i][j] 代表城市i到城市j的花费 本身到本身也有花费 就相当于住宿费吧。
接着每天在每个城市都能赚钱 p[m][n] 代表每天每个城市赚的前。
问m天后最多能赚多少钱。
思路:
比较水的dp吧。
dp[i][j] 代表第i天在j城市 最多赚了多少钱。
起点在1,所以dp[0][1]=0
然后三重循环dp就好了·
注意赚的钱有可能是负的~
然后输入的n和m别反了。
代码:
#include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"algorithm" #include"iostream" #include"map" #include"stack" #include"vector" #define ll __int64 #define inf -999999999999999999LL using namespace std; ll c[1234][1234],p[1234][1234]; ll dp[1234][1234]; int main() { int n,m; while(scanf("%d%d",&n,&m),(n+m)) { if(n==0 || m==0) { puts("0"); continue; } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%I64d",&c[i][j]); for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) scanf("%I64d",&p[i][j]); for(int i=0; i<=m; i++) for(int j=1; j<=n; j++) dp[i][j]=inf; dp[0][1]=0; for(int i=1; i<=m; i++) { for(int j=1; j<=n; j++) { for(int k=1; k<=n; k++) { if(p[i][k]<0) continue; dp[i][k]=max(dp[i][k],dp[i-1][j]+p[i][k]-c[j][k]); } } } ll ans=inf; for(int i=1; i<=n; i++) ans=max(ans,dp[m][i]); printf("%I64d\n",ans); } return 0; }
时间: 2024-10-06 05:23:05