状压DP LightOJ 1011 1037 状压dp简单题
2014-02-26 15:17
148 查看
状态压缩DP …看了一个很好的入门介绍,是华中科技大学的暑假培训ppt,感觉讲的很好,里面有几点值得注意,比如
n<=16 是重要条件,是状态压缩的标志;还有 状态压缩dp: 用尽量少的状态表示出dp的整个过程,压缩所有不必要的信息; 状压dp的典型方式:当需要表示一个集合有那些元素的时,往往利用2进制用一个整数表示。
然后,去做lightoj 的1037,想不出来,就看了Forum,有人推荐了先做1011,还是做不出,,,,我果然好弱;
搜了一篇题解,写的很好,这篇题解提供了两种方法:一种是KM算法(高达上,orz),另一种就是状压dp加记忆化搜索。
参考着这篇题解,终于算领会了一点状压dp,写出来了1011,代码如下:
写完1011,再去看1037发现,其实是一样的,,又写了发1037:
n<=16 是重要条件,是状态压缩的标志;还有 状态压缩dp: 用尽量少的状态表示出dp的整个过程,压缩所有不必要的信息; 状压dp的典型方式:当需要表示一个集合有那些元素的时,往往利用2进制用一个整数表示。
然后,去做lightoj 的1037,想不出来,就看了Forum,有人推荐了先做1011,还是做不出,,,,我果然好弱;
搜了一篇题解,写的很好,这篇题解提供了两种方法:一种是KM算法(高达上,orz),另一种就是状压dp加记忆化搜索。
参考着这篇题解,终于算领会了一点状压dp,写出来了1011,代码如下:
// // main.cpp // LJ1011 // #include <iostream> #include <cstring> using namespace std; const int maxn = 1<<16; int dp[maxn]; int v[16][16]; int n; int dfs(int x,int m) { if(m==0) return 0; if(dp[x]) return dp[x]; for(int i=0;i<n;i++) if((1<<i)&x) dp[x]=max(dp[x],dfs((1<<i)^x,m-1)+v[m-1][i]); return dp[x]; } int main() { ios::sync_with_stdio(0); int T,cnt=0; cin>>T; while(T--) { cout<<"Case "<<++cnt<<": "; cin>>n; memset(dp,0,sizeof dp); for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>v[i][j]; cout<<dfs((1<<n)-1,n)<<endl; } return 0; }
写完1011,再去看1037发现,其实是一样的,,又写了发1037:
// LJ 1037 // churehill #include <iostream> #include <cstring> using namespace std; #define INF 0x3f3f3f3f int n; const int maxn = 1<<15; int dp[maxn]; int bt[15]; char v[15][16]; int sh(int x,int b) { char te = '1'; for(int i=0;i<n;i++) if(x&(1<<i)) { te = max(te,v[i][b]); } return bt[b]/(te-'0')+((bt[b]%(te-'0'))?1:0); } int dfs(int x,int m) { if(m==0) return 0; if(dp[x]<INF) return dp[x]; for(int i=0;i<n;i++) if((1<<i)&x) dp[x]=min(dp[x],dfs(x^(1<<i),m-1)+sh(x^(1<<i),i)); return dp[x]; } int main() { int T,cnt=0; cin>>T; while(T--) { cout<<"Case "<<++cnt<<": "; cin>>n; memset(dp,0x3f,sizeof dp); for(int i=0;i<n;i++) cin>>bt[i]; for(int i=0;i<n;i++) cin>>v[i]; cout<<dfs((1<<n)-1,n)<<endl; } }
相关文章推荐
- lightoj1037 状压DP(入门级)
- LightOJ - 1037 Agent 47(状压DP)
- LightOJ - 1037 Agent 47(状压DP)
- LightOJ 1037 - Agent 47(状压DP)
- light oj 1037 状压dp
- LightOJ - 1037 Agent 47(状压DP)
- lightoj 1037 - Agent 47 状压DP
- light oj 1011 marriage ceremonies (状压dp)
- LightOJ - 1037 Agent 47(状压DP)
- LightOJ - 1037 Agent 47(状压DP)
- zoj 3471 Most Powerful 状压dp(简单)
- LightOJ - 1037 Agent 47(状压DP)
- POJ 2688 简单的TSP问题,状压DP
- lightoj 1011 Marriage Ceremonies (状压dp)
- LightOJ1011---Marriage Ceremonies (状压dp)
- LightOJ - 1037 Agent 47(状压DP)
- Lightoj 1011 Marriage Ceremonies(状压dp入门 or km板子)
- LightOJ 1011 - Marriage Ceremonies (状压dp)
- vijos 1037 搭建双塔 简单DP
- LightOJ - 1037 Agent 47(状压DP)