题目的hint应该是给错了 第三天应该是从2到1 连hint都错了。。怪不得这题目过的人不多。。
题意是有n个城市,一个人要在m天内travel 这n个城市。他每天在一个城市 要得到一个income 但是从一个城市到另一个城市也要有cost 如果呆在一个城市 也就是在矩阵中的从i到i表示呆在这个城市的cost
nm 都小于100 然后给出n*n的矩阵 cost cost[i][j]表示的是从i到j的花费
然后一个m*n的矩阵 income[i][j]表示第i天在城市j得到的钱。
最后要m天后total income 最大 求这个最大值
dp过程比较好想吧,dp[i][j]表示第i天在城市j 所能得到最大的total income
状态转移方程
dp[i][j]=max{ dp[i-1] [ k ] -cost[k][i] } +income[i][j]
也就是前一天 从所有城市到j 求最大值。
复杂度是n^2*m 也就是三次方 但是nm才100.所以肯定是可以的。
开始敲代码了。
敲完了! 贡献了一次wa! 因为循环dp的时候把m写成n了。。。dp的一维是天数 所以是m
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=105,inf=1<<30;
int cost[maxn][maxn];//cost[i][j]是从i到j的花费
int income[maxn][maxn];//income[i][j] 是第i天在城市j的收入
int dp[maxn][maxn];// dp[i][j]表示第i天在城市j的最大的total income
int n,m;
int dp_work()
{
int i,j,k,max,ans;
for(i=1;i<=n;++i)
dp[1][i]=income[1][i]-cost[1][i];
for(i=2;i<=m;++i)
{
for(j=1;j<=n;++j)
{
max=-inf;
for(k=1;k<=n;++k)
{
if(dp[i-1][k]-cost[k][j] >max )
max=dp[i-1][k] - cost[k][j];
}
dp[i][j]=max+income[i][j];
}
}
ans=-inf;
for(i=1;i<=n;++i)
if(dp[m][i]>ans)
ans=dp[m][i];
return ans;
}
int main()
{
int i,j,ans;
while(scanf("%d%d",&n,&m),(n||m))
{
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
scanf("%d",&cost[i][j]);
for(i=1;i<=m;++i)
for(j=1;j<=n;++j)
scanf("%d",&income[i][j]);
ans = dp_work();
printf("%d\n",ans);
}
return 0;
}