NOIP2008 传纸条

题目

luogu1006

vijos1493

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath> 
#define N 60
using namespace std;

int n,m,mp[N][N];
int f[N][N][N][N];//f[i][j][l][r]表示两张纸分别传到(i,j)和(l,r)的最大好心程度 

int main()
{
	scanf("%d%d",&m,&n);
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++) scanf("%d",&mp[i][j]);
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			for(int l=1;l<=m;l++)
				for(int r=1;r<=n;r++)
				{
					int t=max(f[i-1][j][l-1][r],max(f[i-1][j][l][r-1],max(f[i][j-1][l-1][r],f[i][j-1][l][r-1])));
					if(i==l&&j==r)//若两张纸条传至相同的地方,只记录一次的值,那么这必然不会是最优情况,会在后续被更新,所以路径不会重复
						f[i][j][l][r]=t+mp[i][j];
					else  f[i][j][l][r]=t+mp[i][j]+mp[l][r];
				}
	printf("%d",f[m][n][m][n]);
	return 0;
}
原文地址:https://www.cnblogs.com/XYZinc/p/7521445.html