51nod 1411 矩阵取数问题 V3
第一行两个整数m, n (0 < m, n < 10),表示矩阵的行数和列数。
后面m行,每行n个整数表示矩阵里的数,整数范围[-10000000, +10000000]。
一个整数表示最大得分。
插头dp,状态可以用滚动数组存
#include<cstdio>
#include<cstring>
int n,m;
int v[][];
int s0[+],s1[+];
bool po[];
const int v0=-;
inline void maxs(int&a,int b){if(a<b)a=b;}
inline int _l(int x,int w){
int t=,a;
do{
w-=;
a=x>>w&;
t+=(a>>)-(a&);
}while(t);
return w;
}
inline int _r(int x,int w){
int t=,a;
do{
w+=;
a=x>>w&;
t-=(a>>)-(a&);
}while(t);
return w;
}
int main(){
scanf("%d%d",&n,&m);
int ans=v0;
for(int i=;i<=n;++i){
for(int j=;j<=m;++j){
scanf("%d",v[i]+j);
if(v[i][j]>ans)ans=v[i][j];
}
}
if(ans<=)return printf("%d\n",ans),;
int mx=<<*(m+);
for(int i=;i<mx;++i){
int t=;
for(int j=;j<=m;++j)t+=((i>>j*&)==);
po[i]=(t<=);
}
for(int i=;i<mx;++i)s1[i]=v0;
s1[]=;
for(int i=;i<=n+;++i){
for(int j=;j<=m;++j){
for(int p=;p<mx;++p){
s0[p]=s1[p];
s1[p]=v0;
}
for(int p=;p<mx;++p)if(s0[p]!=v0&&po[p]){
int tt=;
for(int t=;t<=m;++t)tt+=(p>>t*&)+(p>>t*+&);
bool is=(tt==);
if(is)maxs(ans,s0[p]);
int p1=j*-,p2=j*;
int a=p>>p1&,b=p>>p2&,c=s0[p]+v[i][j],d1=~(<<j*-),d2=~(<<j*);
switch(a){
case :{
switch(b){
case :{
maxs(s1[p],s0[p]);
maxs(s1[p|<<p2],c);
maxs(s1[p|<<p1],c);
maxs(s1[p|<<p1|<<p2],c);
break;
}
case :{
maxs(s1[p],c);
maxs(s1[p&d2|<<p1],c);
maxs(s1[p&d1&d2|<<_r(p,p2)],c);
break;
}
case :{
maxs(s1[p],c);
maxs(s1[p&d2|<<p1],c);
maxs(s1[p&d1&d2|<<_l(p,p1)],c);
break;
}
case :{
maxs(s1[p],c);
maxs(s1[p&d2|<<p1],c);
break;
}
}
break;
}
case :{
switch(b){
case :{
maxs(s1[p&d1|<<p2],c);
maxs(s1[p],c);
maxs(s1[p&d1|<<_r(p,p2)],c);
break;
}
case :{
maxs(s1[p&d1&d2^<<_r(p,p2)],c);
break;
}
case :{
maxs(s1[p&d1&d2|<<_r(p,p2)],c);
break;
}
}
break;
}
case :{
switch(b){
case :{
maxs(s1[p&d1|<<p2],c);
maxs(s1[p],c);
maxs(s1[p&d1|<<_l(p,p1)],c);
break;
}
case :{
maxs(s1[p&d1&d2],c);
break;
}
case :{
maxs(s1[p&d1&d2^<<_l(p,p1)],c);
break;
}
case :{
maxs(s1[p&d1&d2|<<_l(p,p1)],c);
break;
}
}
break;
}
case :{
switch(b){
case :{
maxs(s1[p&d1|<<p2],c);
maxs(s1[p],c);
break;
}
case :{
maxs(s1[p&d1&d2|<<_r(p,p2)],c);
break;
}
case :{
maxs(s1[p&d1&d2|<<_l(p,p1)],c);
break;
}
case :{
if(tt==)maxs(ans,c);
break;
}
}
break;
}
}
}
if(i==n+)break;
}
for(int a=mx-;a>=;a-=){
s1[a+]=s1[a+]=s1[a+]=v0;
s1[a]=s1[a>>];
}
}
printf("%d",ans);
return ;
}
51nod 1411 矩阵取数问题 V3的更多相关文章
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
- 51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 1084 矩阵取数问题 V2 基准时间限制:2 秒 空 ...
- 51nod动态规划-----矩阵取数
一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格. 1 3 3 2 1 3 2 2 1 能够获得的最 ...
- 51Nod 1084 矩阵取数问题 V2 双线程DP 滚动数组优化
基准时间限制:2 秒 空间限制:131072 KB 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上.第1遍时只能向下和向右走,第2遍时只能向 ...
- 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 ...
- 51Nod 1083 矩阵取数问题 | 动态规划
#include "bits/stdc++.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3 ...
- 51Nod 1084:矩阵取数问题 V2(多维DP)
1084 矩阵取数问题 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励 ...
- 51nod 更难的矩阵取数问题(动态规划)
更难的矩阵取数问题 给定一个m行n列的矩阵,矩阵每个元素是一个正整数,你现在 在左上角(第一行第一列),你需要走到右下角(第m行,第n列),每次只能朝右或者下走到相邻的位置,不能走出矩阵.然后再从右下 ...
随机推荐
- 用Rprofile文件配置打开时R的设置
R中经常会使用一些命令,而且需要重复输入,非常麻烦.如果能够一打开R就直接使用会方便很多. 通过配置一个.Rprofile文件,可以达到我们的目的. 注:本文仅适用于Mac # 创建一个.Rprofi ...
- 腾讯优测干货精选| 安卓开发新技能Get -常用必备小工具汇总
文/腾讯公司 陈江峰 优测小优有话说: 移动研发及测试干货哪里找?腾讯优测-优社区你值得拥有~ 开发同学们都知道,安卓开发路上会碰到很多艰难险阻,一不小心就被KO.这时候,没有新技能傍身怎么行?今天我 ...
- SAP系统联机应用程序帮助
新安装好的SAP系统,联机帮助是不能用的. 通过菜单中的“帮助-应用程序帮助” 和“帮助-SAP库”都打不开任何帮助页面.这并不是因为SAPgui安装不完整,而是因为SAP的帮助系统本身就不包含在GU ...
- DB2 函数大全
DB2函数大全 函数名 函数解释 函数举例 AVG() 返回一组数值的平均值. SELECTAVG(SALARY)FROMBSEMPMS; CORR(),CORRELATION() 返回一对数值的关系 ...
- C#部分---二维数组、split分割;
二维数组定义方式: int[,] array = new int[3, 4]{ {1,2,3,4}, {3,4,5,6}, {5,6,7,8} }; 3表示,有三个一 ...
- JavaWeb学习记录(五)——Servlet随机产生验证码
随机产生验证码的工具类: import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;impo ...
- P235 实战练习(集合类2)、摇奖程序和验证码(修改版)
1.分别向Set集合以及List集合中添加“A”.“a”.“c”.“C”.“a”5个元素,观察重复值“a”能否在List集合以及Set集合中成功添加. package org.hanqi.practi ...
- thinkPHP 中去除URL中的index.php
例如你的原路径是 http://localhost/app/index.php/module/action/var/value/ 那么现在的地址是 http://localhost/app/modul ...
- (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
- Android项目——短信发送器
因为应用要使用手机的短信服务,所以要在清单文件AndroidManifest.xml中添加短信服务权限: <?xml version="1.0" encoding=" ...