hdu 2167 Pebbles 状态压缩dp
2015-10-15 16:43
513 查看
建议先做hdu1565题。两题类型相似。1565稍简单。
注意该题存在某行一个都不选的情况。
注意该题存在某行一个都不选的情况。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int dp[2][1<<20]; int map[20][20]; char c[20]; int s[1<<15]; int main() { int lon=0; for(int i=0;i<(1<<15);i++) { if(!(i&(i<<1))) s[lon++]=i; } while(cin>>map[0][0]) { int y=1; char ch; int n; while(1) { scanf("%d",&map[0][y++]); ch=getchar(); if(ch==10) { n=y; break; } } for(int i=1;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]); int end=1<<n; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { int p=1&i; for(int k=0;k<lon;k++) { if(s[k]>=end) break; int sum=0; for(int j=0;j<n;j++) if(s[k]&(1<<j)) sum+=map[i][j]; int maxn=0; for(int j=0;j<lon;j++) { if(s[j]>=end) break; if((s[j]&s[k])||((s[j]<<1)&s[k])||((s[k]<<1)&s[j])) continue; maxn=max(maxn,dp[1-p][s[j]]); } dp[p][s[k]]=maxn+sum; /*cout<<dp[p][s[k]]<<endl;*/ } /*cout<<"__________"<<endl;*/ } int d=(n-1)&1; int maxv=0; for(int i=1;i<lon;i++) { if(s[i]>=end) break; maxv=max(maxv,dp[d][s[i]]); } cout<<maxv<<endl; } return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow
- zoj3605 Find the Marble(三维dp)
- Word Break I,II, Triangle,Palindrome Partitioning 动态规划 DP