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列),每次只能朝右或者下走到相邻的位置,不能走出矩阵.然后再从右下 ...
随机推荐
- linux 安装redis
1:首先命令行下载安装包 wget http://download.redis.io/releases/redis-2.8.13.tar.gz 2:进行解压 tar xzf redis-2.8.13. ...
- String类、正则表达式
一.String类 String使用非常频繁,用来描述一个字符串.String中实现了很多 对字符串方便的操作方法. String内部使用char[]实现字符串的数据保存 字符串的&quo ...
- Jdbc 连接MySQL数据库的方法和问题
用eclipse写代码.编译之前,先右键点击项目,选择Build Path->library->add external library, 到MySQL网站下载MySQL的Jdbc驱动,把 ...
- VGA DVI HDMI区别
VGA,DVI,HDMI是目前常用的3种不同显示接口的名称.在树莓派的边缘既有HDMI的接口,也有RCA的接口,而显示器上也是既有DVI,又有VGA.上个月买连接线,没有仔细检查买了一根HDMI对VG ...
- makefile--统一目标输出目录 (六)
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 上一节我们把规则单独提取出来,方便了Makefile的维护,每个模块只需要给出关于自己的一些变量 ...
- 关于display的那些事儿!
关于display的那些事儿! display,display,display!嘿嘿嘿!display这一CSS属性,还是相当神奇的哦!给它设置不同的值,被修饰的标签相应的就随之变换了自身的属性特性, ...
- CUDA学习笔记(一)【转】
CUDA编程中,习惯称CPU为Host,GPU为Device.编程中最开始接触的东西恐怕是并行架构,诸如Grid.Block的区别会让人一头雾水,我所看的书上所讲述的内容比较抽象,对这些概念的内容没有 ...
- 使用PHP的curl扩展实现跨域post请求,以及file_get_contents()百度短网址例子
<?php $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,"http://dwz.cn/create.php"); curl_se ...
- Android 反编译 代码注入之HelloWorld
为了向经典的"Hello, World"致敬,我们也从一个简单的程序开始HelloWorld.apk.当你把这个APK安装到手机上运行后,在屏幕上就显示一行文字"Hell ...
- IIS管理器的快捷方式在哪里?
两种重新创建IIS快捷方式的方法,希望对大家有所帮助 1.首先需要明白它本来就是个快捷方式,所以可以重新创建一个新的快捷方式:右击桌面>>新建>>快捷方式.弹出创建快捷方式向导 ...