标签:
题意:
给你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;
}
标签:
原文地址:http://blog.csdn.net/wdcjdtc/article/details/45361747