Sicily1767(双线程动态规划)

NOIP2008传纸条,有点神奇的动态规划。

重合时赋值为0,则不会出现重合的情况。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[110][52][52]={{{0}}};
int main()
{
	int m,n;
	while (scanf("%d%d",&m,&n)!=EOF)
	{
		memset(dp,0,sizeof(dp));
		int x1,x2,k;
		int A[500][500];
		for (x1=1;x1<=m;x1++)
			for (x2=1;x2<=n;x2++)
				scanf("%d",&A[x1][x2]);
		for (k=1;k<=m+n-2;k++)
			for (x1=1;x1<=min(m,k+1);x1++)
				for (x2=1;x2<=min(m,k+1);x2++)
				{
					if (x1!=x2)
					  dp[k][x1][x2]=max(max(dp[k-1][x1-1][x2],dp[k-1][x1][x2-1]),max(dp[k-1][x1][x2],dp[k-1][x1-1][x2-1]))+A[x1][k-x1+2]+A[x2][k-x2+2];
					else
						dp[k][x1][x2]=0;//max(max(dp[k-1][x1-1][x2],dp[k-1][x1][x2-1]),max(dp[k-1][x1][x2],dp[k-1][x1-1][x2-1]))+A[x1][k-x1+2];

				}
		/*for (k=1;k<=m+n-2;k++)
		{
			printf("k:");
			for (x1=1;x1<=min(m,k+1);x1++)
				for (x2=1;x2<=min(m,k+1);x2++)
					printf("dp[%d][%d][%d]:%d ",k,x1,x2,dp[k][x1][x2]);
			printf("\n");
		}*/

		printf("%d\n",dp[m+n-2][m-1][m]);
	}
	return 0;
}


你可能感兴趣的:(Sicily1767(双线程动态规划))