http://poj.org/problem?id=3230

dp[i][j]表示第i天在城市j取得的最大价值

这题要注意初始化,最大价值可能是负的。

View Code
#include <iostream>
using namespace std ;
int cost[101][101],income[101][101] ;
int dp[101][101] ;
int main()
{
    int n,m ;
    while(scanf("%d%d",&n,&m),n||m)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&cost[i][j]) ;
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&income[i][j]) ;
        for(int i=0;i<101;i++)
            for(int j=0;j<101;j++)
                dp[i][j]=-10000 ;
        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++)
                    dp[i][j]=max(dp[i][j],dp[i-1][k]+income[i][j]-cost[k][j]) ;
        int maxx=-10000 ;
        for(int i=1;i<=n;i++)
            maxx=max(maxx,dp[m][i]) ;
        printf("%d\n",maxx) ;
    }
    return 0 ;
}