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列),每次只能朝右或者下走到相邻的位置,不能走出矩阵.然后再从右下 ...
随机推荐
- Bandicam视频录制技巧总结+小丸工具箱压缩视频解决视频体积问题
1.视频录制. 录制质量建议选择100,保证原文件的质量才能更好地保证渲染转码后输出视频的质量.音效这里就一个关键点,就是编码器默认的MPEG-1 L2,会导致会声会影渲染输出出错,程序强行关闭,Ve ...
- jq事件冒泡问题
在程序中使用事件对象非常简单,只需为函数添加一个参数,jquery代码如下: $("element").bind("click",function(event) ...
- boot/bootsect.S
!! SYS_SIZE is the number of clicks (16 bytes) to be loaded.! 0x7F00 is 0x7F000 bytes = 508kB, more ...
- uva624 CD 01背包+输出最优解
link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Sql Server_笔记
1.随机取出10条数据:select top 10 * from tablename order by newid()
- 工作中遇到的问题--JPA 一对多查询
/** * order by gs.updateDate desc * SELECT gs FROM GoodStatus gs WHERE gs IN( * @ ...
- JavaWeb学习记录(二十三)——文件上传与下载
一.导入jar包
- Apahce的虚拟用户认证及server-status页
一.Apache虚拟用户认证配置 编辑配置文件加入如下内容: <Directory "/www/htdoc/fin"> Options None AllowOverri ...
- 15款Chrome浏览器插件让设计师告别拖延症
秋高气爽,分享一大波有效帮助设计师提高工作效率的Chrome浏览器扩展程序! 高效是另一种王道 无论是在工作中,还是在生活中,有些词我们说来就满满正能量,而另外一些话提起就很沮丧,后者如拖延症,前者如 ...
- fs event_socket
mod_event_socket Skip to end of metadata Created by John Boteler, last modified by Niek Vlesse ...