CODE[VS] 1043 方格取数

题目链接:

CODE[VS] 1043 方格取数

题目描述 Description

设有N * N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数.此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。

思路:

跟传纸条是一个题,不过有了新的体会.

dp[x1][y1][x2][y2] = max:{dp[x1-1][y1][x2-1][y2],dp[x1-1][y1][x2][y2-1],dp[x1][y1-1][x2][y2-1],dp[x1][y1-1][x2][y2-1]} + a[x1][y1];

if(x1!=x2 && y1 != y2) dp[x1][y1][x2][y2] += a[x2][y2]; 
 
//这下清晰了吧....
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;

const int N = 58;
int dp[N][N][N][N]; 
int a[N][N]; 

int main()
{
    int n;
    cin>>n;
    while(1)
    {
        int x, y, w;
        cin>>x>>y>>w;
        if(x+y+w == 0 ) break;
        a[x][y] = w;
    }

    for(int i = 1; i <= n; i++)
    for(int j = 1; j <= n; j++)
    for(int k = 1; k <= n; k++)
    for(int h = 1; h <= n; h++)
    {   
        dp[i][j][k][h] = max(dp[i-1][j][k-1][h], max(dp[i-1][j][k][h-1], max(dp[i][j-1][k-1][h], dp[i][j-1][k][h-1]))) + a[i][j];
        if(i!=k && j!= h) dp[i][j][k][h] += a[k][h];

    }
    printf("%d\n", dp[n][n][n][n]);  
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值