题意:有s个月,c个城市,给出第几个月在第几个城市举办演唱会的收益,并且给出从一个城市到另一个城市的成本,求最大的收益。到达第一个城市不需要成本。
用dp[i][j]表示第j个月在第i个城市举办演唱会可以得到的最大收益。
抄一下别人的题意,这道题目处理一下上一个月上一个城市到这个月这一个城市就好了
转移方程:
dp[i][j]=max(dp[i][j],dp[k][j-1]+pro[i][j]-cost[k][i]);
#include <iostream>
#include <vector>
#include <set>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[200][200];
int pro[200][200];
int cost[200][200];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int s,c,i,j,k,ans=0;
scanf("%d%d",&s,&c);
memset(dp,0,sizeof(dp));
memset(cost,0,sizeof(cost));
memset(pro,0,sizeof(pro));
for(i=1; i<=s; i++)
{
for(j=1; j<=c; j++)
{
scanf("%d",&pro[i][j]);
}
}
for(i=1; i<=s; i++)
{
for(j=1; j<=s; j++)
{
scanf("%d",&cost[i][j]);
}
}
for(i=1; i<=s; i++)
{
dp[i][1]=pro[i][1];//第一个月都是赚的
}
for(j=2; j<=c; j++) //dp[i][j]为第j个月在第i个城市最大利润
{
for(i=1; i<=s; i++) //当前城市
{
for(k=1; k<=s; k++) //上一个月上一个城市
{
dp[i][j]=max(dp[i][j],dp[k][j-1]+pro[i][j]-cost[k][i]);
}
}
}
for(i=1; i<=s; i++)
{
ans=max(ans,dp[i][c]);
}
printf("%d\n",ans);
}
}