51Nod 1084:矩阵取数问题 V2(多维DP)
1084 矩阵取数问题 V2 
基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上。第1遍时只能向下和向右走,第2遍时只能向上和向左走。两次如果经过同一个格子,则该格子的奖励只计算一次,求能够获得的最大价值。
例如:3 * 3的方格。
1 3 3
2 1 3
2 2 1
能够获得的最大价值为:17。1 -> 3 -> 3 -> 3 -> 1 -> 2 -> 2 -> 2 -> 1。其中起点和终点的奖励只计算1次。
Input
第1行:2个数M N,中间用空格分隔,为矩阵的大小。(2 <= M, N <= 200)
第2 - N + 1行:每行M个数,中间用空格隔开,对应格子中奖励的价值。(1 <= A[i,j] <= 10000)
Output
输出能够获得的最大价值。
Input示例
3 3
1 3 3
2 1 3
2 2 1
Output示例
17
思路
看做是两个人(假设是A,B)同时从左上角往右下角走,两个人相遇的时候只加一个格子里的数字。因为每次只能往右或往下走,所以从起点到终点走的距离是一定的,即m+n。
用dp[x1][y1][x2][y2]来记录A到达(x1,y1)和B到达(x2,y2)的最大数字和。然而这种写法太占空间了,四维数组,应该会爆内存的,所以需要对其进行优化
设当前走的步数为s,则y1=s-x1;y2=s-x2(因为每次只能走一步,只能向右或向下,所以总步数=横坐标+纵坐标)。dp数组就可以写成dp[s][x1][x2](表示走了s步,A在x1位置和B在x2位置取到数字的最大和)。
所以状态转移方程就可以写成:
当A,B不在同一点时:dp[s][x1][x2]=max(dp[s-1][x1'][x2'])+a[x1][y1]+b[x2][y2]
A,B在同一点时:dp[s][x1][x2]=max(dp[s-1][x1'][x2'])+a[x1][y1]
最后要注意输入问题,输入的第一个数是列,第二个是行(因为这个输入疯狂WA)
AC代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=250;
using namespace std;
int dp[maxn*2][maxn][maxn];
int a[maxn][maxn];
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int n,m;
ms(dp);
cin>>m>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int s=2;s<=n+m;s++)
{
for(int x1=1;x1<=n;x1++)
{
for(int x2=1;x2<=n;x2++)
{
int y1=s-x1;
int y2=s-x2;
if(y1>=1&&y2>=1&&y1<=m&&y2<=m)
{
dp[s][x1][x2]=max(dp[s-1][x1-1][x2],max(dp[s-1][x1][x2-1],max(dp[s-1][x1][x2] ,dp[s-1][x1-1][x2-1])));
if(x1==x2)
dp[s][x1][x2]+=a[x1][y1];
else
dp[s][x1][x2]+=a[x1][y1]+a[x2][y2];
}
}
}
}
cout<<dp[n+m][n][n]<<endl;
return 0;
}
51Nod 1084:矩阵取数问题 V2(多维DP)的更多相关文章
- 51Nod 1084 矩阵取数问题 V2 双线程DP 滚动数组优化
基准时间限制:2 秒 空间限制:131072 KB 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上.第1遍时只能向下和向右走,第2遍时只能向 ...
- 51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 1084 矩阵取数问题 V2 基准时间限制:2 秒 空 ...
- 1084 矩阵取数问题 V2
1084 矩阵取数问题 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下 ...
- 51nod1084 矩阵取数问题 V2
O(n4)->O(n3)妈呀为什么跑这么慢woc #include<cstdio> #include<cstring> #include<cctype> #i ...
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
- 51nod 1411 矩阵取数问题 V3
给定一个m行n列的矩阵,你可以从任意位置开始取数,到达任意位置都可以结束,每次可以走到的数是当前这个数上下左右的邻居之一,唯一的限制是每个位置只能经过一次,也就是说你的路径不自交.所经过的数的总作为你 ...
- 51nod动态规划-----矩阵取数
一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格. 1 3 3 2 1 3 2 2 1 能够获得的最 ...
- 51nod 1083 矩阵取数问题【动态规划】
一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格. 1 3 3 2 1 3 2 2 1 能够获得的最 ...
- 51nod 1083 矩阵取数问题
就很简单很简单的dp 只能从右或者从下走 所以 dp方程直接看下面公式吧 反正也不难 #include<bits/stdc++.h> using namespace std; ; in ...
随机推荐
- How to import a GitHub project into Eclipse
Assuming you have created a project in GitHub, these are the steps to import it into Eclipse. First, ...
- CAD(布置厨洁具)(尺寸标注)5.12
"TYTK"打开图库,找到平面厨具和洁具.双击选中的厨具,A可以不停旋转90度.给厨具选取正确的位置.画出灶台线,同理画出卫生间的家具.绘制出洗脸台的平台.浴缸的平台. 尺寸标注: ...
- 【框架】PageObject(一)
1.目的:为了将元素的find方法和业务逻辑分开来.如果元素的页面位置发生了变化,只需改动一个文件,而不影响业务的实现. 2.原理:一般一个页面对应一个class,在class里描述所有要用到的web ...
- learning ddr mode register MR2
- python-递归,二分查找
# print(list("胡辣汤")) # lst = ["河南话", "四川话", "东北", "山东&q ...
- c语言中printf("%x",-1);为什么会输出-1的十六进制补码??
计算机存储的时候是以补码的形式存进去的,输出来在以你原码的形式输出(这个形式就是你设置的形式)! 比如: -1 (32位模式) 存: 1 000000000000000000000000000000 ...
- sas 变量类型转换
data b2: set b1; newbl=put(oldbl,10.); run; 根据转换后的类型灵活填写
- LeetCode 43 字符串相乘
题目: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...
- Centos7扩展存储空间
1.在关机状态下,在Vm里面设置系统大小到需要的数值 :2.使用root权限登陆linux,df -h查看系统情况: [root@cratedb-hk-01 ~]# df -h 文件系统 容量 已用 ...
- PropertiesUtil 读取properties
package com.midea.clean.util; import java.io.InputStream; import java.io.UnsupportedEncodingExceptio ...