【NOIP2008】传纸条

用一个四维数组保存状态,从左方,上方分别尝试转移

#include
#define R(i,a,b) for(int i=a;i<=b;i++)
#define uR(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

int m,n,a[51][51],f[51][51][51][51];
int main(){
	cin>>m>>n;
	R(i,1,m)R(j,1,n)cin>>a[i][j];
	R(i1,1,m)R(j1,1,n)R(i2,1,m)R(j2,1,n){
		f[i1][j1][i2][j2]=a[i1][j1]+a[i2][j2]+max(max(f[i1-1][j1][i2-1][j2],f[i1][j1-1][i2-1][j2]),max(f[i1-1][j1][i2][j2-1],f[i1][j1-1][i2][j2-1]));
		if(i1==i2&&j1==j2)f[i1][j1][i2][j2]-=a[i1][j1];
	}
	cout<

你可能感兴趣的:(动态规划之序列dp)