hdu1565方格取数(1)【状态压缩】
来源:互联网 发布:淘宝限制购物怎么解除 编辑:程序博客网 时间:2024/06/10 15:54
78节课的时候看了两个记忆化搜索的题,居然~都!不!会!那就做原来计划的状态压缩吧,然而看题解都不懂,看代码发现自己太弱T^T二进制枚举方案数都不会用。能猜到的唯一是既然是状态压缩,就是要从上一行到下一行的时候数组循环利用orz晚上状态也不好,胃好涨,两个小时踉踉跄跄才搞完这个题。据说这个题正解是最小割。等假期刷图论吧
/**********hdu15652015.12.12639MS 1788K 1622B**********/#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int L = 20000;int n,a[20][20];int dp[L],tem[L];int now[L],pre[L];int ans[L],pre_size,now_size;void dfs(int id,int k,int p,int sum){ if(k>=n)//超过n则可以记录这个状态 不仅仅是==n! { now[++now_size] = p; ans[now_size] = sum; return ; } dfs(id,k+2,p|(1<<k),sum+a[id][k]);//这个位置取了,那么就要加上这个位的二进制,通过或运算得出,这个位置取了的话,那么下一个要取的至少要跳两格 dfs(id,k+1,p,sum);//这个位置不取并跳一格}void DP(){ int i,j,k; for(k = 1; k<=n; k++) { now_size = 0; dfs(k,0,0,0);//搜出此行的所有状态 for(i = 1; i<=now_size; i++) dp[i] = 0; for(i = 1; i<=now_size; i++) { for(j = 1; j<=pre_size; j++) { if(now[i]&pre[j]) continue;//相与为1,证明有相邻而不继续往下 dp[i] = max(dp[i],tem[j]+ans[i]); } } for(i = 1; i<=now_size; i++)//目前这行的状态保存为上一行 { tem[i] = dp[i]; pre[i] = now[i]; } pre_size = now_size; }}int main(){ int i,j; while(~scanf("%d",&n)) { for(i = 1; i<=n; i++) for(j = 0; j<n; j++) scanf("%d",&a[i][j]); tem[1] = pre[1] = 0;//先取一个,但是位置并不确定, pre_size = 1; DP(); int ans = 0; for(i = 1;i<=pre_size;i++) ans = max(ans,tem[i]); printf("%d\n",ans); } return 0;}
0 0
- hdu1565方格取数(1)【状态压缩】
- hdu1565 方格取数(状态压缩)
- HDU1565 方格取数(1) (状态压缩DP)
- HDU1565:方格取数(1) (状态压缩DP)
- HDU1565方格取数(1)(状态压缩DP)
- hdu1565 方格取数(1)
- 【HDU1565】方格取数1
- HDU1565方格取数
- HDU1565 方格取数(1)网络流
- HDU1565——方格取数(1)
- HDU1565 方格取数(1) 网络流
- HDU1565 方格取数(1) 题解
- 状态压缩--方格取数
- hdu1565 方格取数 最大流(二分图极大点权独立集) 或状态压缩dp
- HDU1565—方格取数(1)——状压DP
- hdu1565方格取数(1) (最大权独立集)
- HDU1565 方格取数(1) —— 状压DP
- hdu1565 方格取数(1)(状压dp)
- Esper剖析
- 《剑指offer》——打印1到最大的n位数
- swift控件之旅之UITextField
- LInux学习网站
- iOS越狱开发
- hdu1565方格取数(1)【状态压缩】
- windows API实现用户选择文件路径的对话框
- 阅读赵炯的《Linux内核完全注释》之前必须知道的!
- iOS越狱检测
- android-CTS调试方法
- KMP算法
- RandomAccessFile
- ecelpse网格DEBUG步骤
- 二叉树的先序中序后序遍历问题