状态压缩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的更多相关文章

  1. 状态压缩dp(hdu2167,poj2411)

    hdu2167 http://acm.hdu.edu.cn/showproblem.php?pid=2167 给定一个N*N的板子,里面有N*N个数字,选中一些数字,使得和最大 要求任意两个选中的数字 ...

  2. HDU1565+状态压缩dp

    简单的压缩状态 dp /* 状态压缩dp 同hdu2167 利用滚动数组!! */ #include<stdio.h> #include<string.h> #include& ...

  3. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  4. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  5. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  6. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  7. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  8. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

  9. BZOJ-1226 学校食堂Dining 状态压缩DP

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...

随机推荐

  1. SqlBulkCopy 数据批量操作使用的类

    private void SqlBulkCopyByDataTable(string connectionString,string TableName,DataTable dt) { using ( ...

  2. EXT.NET学习笔记(一) 下载配置使用

    新公司使用ext.net开发,开始学习该知识: 首先下载ext.net,目前我使用的版本为1.7,该版本免费,基本的功能也够用,使用ext.net进行开发时强烈建议使用VS2015,能便捷的提示,大大 ...

  3. Microsoft SQL Server 获得本地帮助方法

    微软的自带的帮助文档不管是对于开发人员还是DBA都是相当的重要.一般在有网络的状况下可以直接访问 http://msdn.microsoft.com/query/dev10.query?appId=D ...

  4. Objective-C 学习笔记(Day 1)

    -------------------------------------------- Hello World //引入头文件 //c中的引入头文件的方式 //#include <stdio. ...

  5. js闭包的使用例子

    网上关于闭包的介绍太多,这就导致了泛滥,对于新手来说,网上好多讲解就说了闭包是啥,还都是用下面这种例子: 我的天啊,我们都看了不知道多少遍了,看完有啥用?在什么场合下用啊? 于是我翻阅各种资料,自己总 ...

  6. Fire Net

    Fire Net Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Subm ...

  7. OpenJudge/Poj 1191 棋盘分割

    1.链接地址: http://bailian.openjudge.cn/practice/1191/ http://poj.org/problem?id=1191 2.题目: 总时间限制: 1000m ...

  8. 编译内核,配置内核make menuconfig

    http://blog.csdn.net/xuyuefei1988/article/details/8635539 make make modules_install make install 模块安 ...

  9. QtSQL学习笔记(2)- 连接到数据库

    要使用QSqlQuery或者QSqlQueryModel访问一个数据库,首先需要创建并打开一个或多个数据库连接(database connections). 一般地,数据库连接是根据连接名(conne ...

  10. Apache虚拟主机设置

    Apache支持两种虚拟主机,一种是基于IP地址的,一种是基于域名的. 基于IP地址的虚拟机现在使用的很少,它需要一台服务器需要拥有多个IP地址.基于域名的虚拟主机要求服务器有一个IP地址就可以了,只 ...