http://acm.hnu.cn/online/?action=problem&type=show&id=13362&courseid=0
或者是http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=79619
题目很长= =废话挺多。
3 3 4 1 3 20 40 50 20 1 2 20 50 50 1 0 10 10 10 0 10 10 10 0 3 3 20 20 20 20 20 20 20 20 20 0 20 40 20 0 40 40 10 0 2 4 10 20 10 20 20 10 20 10 0 5 5 0
看这组样例= =
3表示测试样例,3,4 表示3个城市,4场音乐会
下面有3行4列,每一行表示4场演唱会在该城市演唱时的的预期收入,下面有3行3列,分别表示城市移动的代价,比如0 10 10表示从1-1是0,1-2是10,1-3是10。。。。分析完题意,其实是个dp,然后我自己认为这是个背包模型
#include<stdio.h> #include<string.h> #include<algorithm> #include<algorithm> using namespace std; long long dp[105][105]; long long map[105][105]; long long d[105][105]; int main() { int t,n,m; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); memset(map,0,sizeof(map)); memset(d,0,sizeof(d)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&map[i][j]); } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&d[i][j]); } } 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]+map[j][i]-d[k][j]); } } } long long ans=0; for(int i=1;i<=n;i++) { ans=max(ans,dp[m][i]); } printf("%lld ",ans); } return 0; }