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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值