dp Mzx0821月赛系列之情书(1084)


<p>    一次班上做活动,班上同学被安排坐成m行n列的矩阵,Mzx0821坐在坐标(x1,y1)的位置,Zzx坐在坐标(x2,y2)的位置。活动过程中,Mzx0821写了一张纸条想给Zzx,但是Mzx0821又不想班上其他人看到他写的内容,于是Mzx0821给班上每个人定义了一个保密程度值(就是这个人不偷看纸条内容的可能),每个人传递纸条只能给前后左右的人。</p>
<p>    Mzx0821还考虑到万一Zzx给Mzx0821回纸条怎么办呢,为了保密,Mzx0821希望每个人最多传递一次纸条,就是说一个人在Mzx0821传给Zzx的时候帮了忙,就不能再帮Zzx传给Mzx0821,反之亦然。</p>
<p>    Mzx0821希望找到这样两条路,使得来回两条路上的保密程度值的和最大,为了尽快传到,这两条路必须是Mzx0821到Zzx的之间的最短路。</p>
<p>    Mzx0821智商实在捉急,于是向机智的学弟学妹们求助,你能帮助他找到正确的路线吗?</p>
 一道dp题目   
  四维数组记录  i+j=k+l  及三成循环可以遍历所有情况      
 题目链接<a target=_blank href="http://acm.swust.edu.cn/problem/1084/">点击打开链接</a>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#define LL long long
using namespace std;
int max(int x, int y, int k, int l)
{
	int m = x > y ? x : y;
	m = m > k ? m : k;
	m = m > l ? m : l;
	return m;
}	
int dp[55][55][55][55] = { 0 };          //i + j = k + l;
int main()
{
	int n, m, map[55][55], i, j, k, l;
 while(	scanf("%d%d", &n, &m)!=EOF)
 {
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= m; j++)
		{
			scanf("%d", &map[i][j]);
		}
	}
	if(m<2|| n<2)
	{
			printf("0\r\n");
			continue;
	}

	for(i = 1;i <= n;i++)
	{
		for (j = 1; j <= m; j++)
		{
			for (k = i+1; k <= n; k++)      //i+1保证他们不会有交集
			{
				l = i + j - k;
				if (l>m||l<=0)
				{
					continue;
				}
				dp[i][j][k][l] = max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])+map[i][j]+map[k][l];
			}
		}
    }
	printf("%d\r\n",dp[n-1][m][n][m-1]);
 }
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值