cf-279D - The Minimum Number of Variables-数位dp
2013-11-23 20:46
609 查看
数位dp没学好~~
假如每一个数放在一个空箱里。
状态10010代表目前第2个数和第5个数在空箱里。
dp[i]:i状态最少需要几个空箱。
dp[i]:所有i状态的子状态最小需要的空箱数。
dp[1]=1;
假如每一个数放在一个空箱里。
状态10010代表目前第2个数和第5个数在空箱里。
dp[i]:i状态最少需要几个空箱。
dp[i]:所有i状态的子状态最小需要的空箱数。
dp[1]=1;
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; #define maxn 24 int a[maxn]; int dp[1<<maxn]; int n; int have1(int x) { x=(x& 0x55555555)+((x>>1)& 0x55555555); x=(x& 0x33333333)+((x>>2)& 0x33333333); x=(x& 0x0F0F0F0F)+((x>>4)& 0x0F0F0F0F); x=(x& 0x00FF00FF)+((x>>8)& 0x00FF00FF); x=(x& 0x0000FFFF)+((x>>16)& 0x0000FFFF); return x; } int dps(int x,int y) { if(dp[x])return dp[x]; int mc=have1(x); int as=25; int i,j; for(i=1;i<y;i++) { for(j=1;j<=i;j++) { if(a[i]+a[j]==a[y]) { int nc; nc=dps(x&(~(1<<(y)))|(1<<(i))|(1<<(j))|(1<<(y-1)),y-1); as=min(as,max(nc,mc)); } } } dp[x]=as; return dp[x]; } int main() { int i; while(~scanf("%d",&n)) { for(i=1;i<=n;i++)scanf("%d",&a[i]); dp[1<<1]=1; int ans=dps((1<<(n)),n); if(ans==25)ans=-1; cout<<ans<<endl; } }
相关文章推荐
- [CF 279D]The Minimum Number of Variables[状压dp]
- Codeforces Round #171 (Div. 2) D. The Minimum Number of Variables
- The Number of Paths - HDU 1293 DP
- SGU 365 Ships of the Desert 简单数位dp
- UVa 1297 - The Minimum Number of Rooks
- CF Number With The Given Amount Of Divisors
- Find the minimum number of coins
- 第四届 山东省ACM The number of steps (概率dp 待整理)
- The minimum number of elements to reach the end of an array
- upc 2225 The number of steps 期望DP
- codechef_Home » Compete » January Challenge 2013 » The Minimum Number Of Moves
- SGU 407-Number of Paths in the Empire【DP】
- [LeetCode]233 Number of Digit One(数位DP)
- UPC:2225 The number of steps(概率DP)
- SGU 407 Number of Paths in the Empire dp+java大数
- 山东省第四届ACM大学生程序设计竞赛 The number of steps 概率dp
- HDU 3006 The Number of set (状态压缩dp)
- CF-27E - Number With The Given Amount Of Divisors(枚举+dfs)
- In a bunch of number to find out the biggest minimum value
- The number of steps - UPC 2225 dp