HDU2167+状态压缩DP
状态压缩dp
详见代码
/*
状态压缩dp
dp[ i ][ j ]:第i行j状态的最大和
dp[i][j] = max( dp[i-1][k]+sum[i][j] );
题意:给定一个N*N的方格,让你在里面取出一些数使其和最大,要求每一个数不能与其相邻的8个数同时取出
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<math.h>
#include<map>
using namespace std;
const int maxn = ;
int sum[ maxn+ ][ <<maxn ];//sum[i][j]:第i行j状态的数字和
int s[ <<maxn ];//合格的状态的集合
int dp[ maxn+ ][ <<maxn ];//dp[i][j]:第i行j状态的最大和
int mat[ maxn+ ][ maxn+ ];
int binary[ maxn+ ];
void init_binary( ){
binary[ ] = ;
for( int i=;i<;i++ ){
binary[ i ] = *binary[ i- ];
}
} int solve( int n ){
int cnt_state = ;
memset( dp,,sizeof( dp ) );
memset( sum,,sizeof( sum ) );
int N = (<<n);
for( int i=;i<N;i++ ){
if( ((i<<)&i)== ){
s[ cnt_state++ ] = i;
}
}//选出无相邻数字的状态
for( int i=;i<n;i++ ){
for( int j=;j<cnt_state;j++ ){
for( int k=;k<n;k++ ){
if( binary[k]&s[ j ] ){
sum[ i ][ j ] += mat[ i ][ k ];
}
}
}
}//预处理出sum值
int ans = ;
for( int i=;i<cnt_state;i++ ){
dp[][ i ] = sum[ ][ i ];
ans = max( ans,dp[][i] );
}
for( int i=;i<n;i++ ){
for( int j=;j<cnt_state;j++ ){
for( int k=;k<cnt_state;k++ ){//前一行的状态
if( (s[j]&s[k])== ){
if( (s[j]&(s[k]<<))== ){
if( (s[j]&(s[k]>>))== ){
dp[ i ][ j ] = max( dp[ i- ][ k ]+sum[ i ][ j ],dp[ i ][ j ] );
}
}
}
}
ans = max( ans,dp[i][j] );
}
}
return ans;
} int main(){
char str[ ];
init_binary();
while( gets( str ) ){
int len = strlen( str );
int n = ;
for( int i=;i<len;i+= ){
mat[][n++] = (str[i]-'')*+str[i+]-'';
}
for( int i=;i<n;i++ ){
gets(str);
int cc = ;
for( int j=;j<len;j+= ){
mat[i][cc++] = (str[j]-'')*+str[j+]-'';
}
}
int ans = solve( n );
printf("%d\n",ans);
getchar();
}
return ;
}
HDU2167+状态压缩DP的更多相关文章
- 状态压缩dp(hdu2167,poj2411)
hdu2167 http://acm.hdu.edu.cn/showproblem.php?pid=2167 给定一个N*N的板子,里面有N*N个数字,选中一些数字,使得和最大 要求任意两个选中的数字 ...
- HDU1565+状态压缩dp
简单的压缩状态 dp /* 状态压缩dp 同hdu2167 利用滚动数组!! */ #include<stdio.h> #include<string.h> #include& ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
- BZOJ-1226 学校食堂Dining 状态压缩DP
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...
随机推荐
- SpriteFrameCache 精灵帧缓存
//获取精灵帧缓存的单例对象 auto spriteFrameCache = SpriteFrameCache::getInstance(); //从plist文件添加多个精灵帧 spriteFra ...
- C#实现插入排序法
private int[] test_Insertion(int[] list) //插入排序 传入数组 3, 6, 2, 1, 9, 5, 4, 7 { ;i<list.Length;i++) ...
- php入门实现留言板
首先由一个文本文档read.txt liulan.html <!doctype html> <html lang="en"> <head> &l ...
- Sql的实际应用
sql实际应用-递归查询 1.既然要谈到sql,数据库表是必须的 2.数据结构 3.获取某个节点的所有子节点 传统的写法(sql2000) 很麻烦,暂且就不写了 来看看 ...
- Windows Forms(二)
导读 1.用VS创建一个Windows Forms程序 2.分析上面的程序 3.Mediator pattern(中介者模式) 4.卡UI怎么办——BackgroundWorker组件 用VS创建一个 ...
- CSS FIXED porn javhd
CSS position property - W3Schools W3Schools › cssref › pr_class_position Definition and Usage. The p ...
- Java实战之04JavaWeb-04JSP、EL表达式、JSTL标签库
一.jsp部分 只要是与页面显示相关的都是重点 1.jsp的脚本 <%java代码%>:被翻译到service方法内部,局部变量,局部的功能 <%=表达式或变量%>:翻译成se ...
- Java实战之02Hibernate-05检索策略、检索方式
十一.Hibernate的检索策略 1.概述: 查询的时机:什么时候去查? /** * 一张表的检索策略我们称之为: * 类级别的检索策略. * 注意:只要是说类级别的检索策略,就一定不涉及关联对象. ...
- C# IO操作磁盘上的txt
using System.IO; //写入并导出到磁盘 StreamWriter sw = new StreamWriter(@"H:\text.txt"); sw.WriteLi ...
- Class.forName、Class.class(属性)、getClass()的区别
1.出现的时期不同:Class.forName()在运行时加载:Class.class和getClass()是在编译器加载2.Class.class只是在编译时用来存放类的相关信息,并没有实例化对象: ...