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列),每次只能朝右或者下走到相邻的位置,不能走出矩阵.然后再从右下 ...
随机推荐
- jbrowse 的配置与使用gff, vcf, fa, bed, bam
1,jbrowse 是什么东西 ? JBrowse is a genome browser with a fully dynamic AJAX interface, being developed a ...
- SecureCRT最佳配色方法+直接修改默认配置方法 - imsoft.cnblogs
SecureCRT默认显示效果是黑白且刺眼的主题,看起来很不舒服.经过一番搜索,总结结果如下,直接设置默认属性,设置一次,不需再改. 效果图: 具体操作方法: Options->Global O ...
- 设置SAPgui自动退出功能
当客户端长时间没有使用时,为了不占用SAP服务器的资源,我们可以设置当客户端在一段时间没有 进行操作时自动退出SAP系统. 设置步骤如下: 用Tcode rz10打开参数配置窗口,选择你当前的实例参数 ...
- 349. Intersection of Two Arrays
Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...
- ZOJ 1188 DNA Sorting
原题链接 题目大意:给定一串字符串,查找字符串里字母逆序排列的对数,按照由少到多的顺序把所有字符串进行排列. 解法:用C++字符串string类的iterator,从每个字符串的起始开始,查找逆序字符 ...
- 3-4 rpm包查询
概述:yum不能查询已经安装好的rpm包, 就算采用了yum来进行安装,查询方法还是依赖rpm包的查询, 因此rpm包的查询十分常用和重要 1.查询是否安装 <1>rpm -q 包名(不是 ...
- 课堂所讲整理:包装&工具类
package org.hanqi.array; import java.util.Random; public class BaoZhuang { public static void main(S ...
- 关于ZF2中一点感悟,service_manager
在zf2中,在serviceLoctor中自定义的内容,可以通$serviceLocator->get('config')['key'],如果是在serivce_manger中定义的服务名,其实 ...
- 用vi写一个C 程序
root@IdeaPad:~# ls 1.txt 3.txt 5.txt 6.py evilxr test 2.txt 4.txt 5.txt~ e.txt evilxr.txt root@IdeaP ...
- VC++ MFC橡皮筋技术
在MFC下绘制直线,使用橡皮筋技术,可以使直线效果跟随鼠标移动 //OnLButtionDown m_ptOrigin = m_ptEnd = point; //OnMouseMove ...