计蒜之道复赛 腾讯消消乐
2017-07-31 11:35
429 查看
腾讯消消乐 状压dp
题目链接题意是就点进去题目链说的那样.
看一下数据由于n<18 然后考虑用状压dp
dp[i][s] 表示消去i次得到的状态为s的方案数,1代表删了0代表还没删,当我们枚举到一个状态s时,取出所有0位,然后枚举其中的一段,删除掉,即可转移到下一步的该状态,
例如1010101,即表示当前序列已经被删剩下3个,然后枚举这3个数字中的一段如
110,则当前状态可以转移到下一步的1010101+0101000状态.然后是否能转移则可以预处理出每一个状态的GCD.
#include<cmath> #include<algorithm> #include<cstring> #include<string> #include<set> #include<map> #include<time.h> #include<cstdio> #include<vector> #include<list> #include<stack> #include<queue> #include<iostream> #include<stdlib.h> using namespace std; #define LONG long long const LONG INF=0x3f3f3f3f; const LONG MOD=1e9+ 7; const double PI=acos(-1.0); #define clrI(x) memset(x,-1,sizeof(x)) #define clr0(x) memset(x,0,sizeof x) #define clr1(x) memset(x,INF,sizeof x) #define clr2(x) memset(x,-INF,sizeof x) #define EPS 1e-10 #define lson l , mid , rt<< 1 #define rson mid + 1 ,r , (rt<<1)+1 #define root 1, m , 1 LONG dp[20][(1<<18) + 20] ; int num[20] ; int take[(1<<18) + 30] ; int gcd(int a , int b) { int c = a%b ; while(c) a = b ,b = c , c = a %b ; return b; } int main() { int n ; int K ; while(cin >> n>>K) { for(int i = 1 ; i <= n ; ++i) scanf("%d",&num[i]) ; clr0(dp) ; int bit[20 ] ; dp[0][0] = 1; for(int i = 1 ; i< (1<< n) ; ++ i) { int tmp = i ; int p = 0 ; int t = 0 ; clr0(bit) ; for(int j = 0 ;j < n ; ++ j) if( ( tmp>>j )& 1) bit[++p] = j+1 ; int judge = num[bit[1]]; for(int j =1; j < p ;++j) bc61 judge = gcd (judge, num[ bit[j+1] ] ) ; take[i] = judge ; } for(int i = 0 ; i < n ; ++i) for(int j = 0; j < (1<< n) ; ++j) { int tmp = j ; clr0(bit) ; int p= 0; for(int k = 0 ; k < n ; ++ k) if( ( tmp >> k & 1) == 0) bit[++ p] = k ; for(int k = 1 ;k <= p ; ++ k) { int now = j ; int Del = 0 ; for(int l = k ;l <= p ; ++l ) { now += (1<<bit[l]) ; Del += (1<<bit[l]) ; if(take[Del] >= K ) { dp[1+i][ now ] += dp[i][j] ;dp[i+1][now] %= MOD ; } } } } LONG ans = 0; for(int i = 1; i<= n ; ++i) ans = (ans + dp[i][(1<<n)-1] *i ) % MOD ; // printf("%d %lld\n",i, dp[i][(1<<n)- 1]) ; cout<<ans<<endl; } }
相关文章推荐
- 计蒜客 2017 复赛 腾讯消消乐 (状压dp)
- 计蒜之道 2017 程序设计大赛 - 计蒜客 复赛 F 腾讯消消乐 状态压缩dp、枚举+剪枝
- 计蒜之道-2017复赛-腾讯消消乐(状压DP)
- 2017 计蒜之道 复赛 腾讯消消乐
- 计蒜客-2017 计蒜之道 复赛-F-腾讯消消乐
- (状压dp)2017 计蒜之道 复赛 F. 腾讯消消乐
- 计蒜之道-2017复赛-腾讯消消乐(状压DP)
- 2017 计蒜之道 复赛 腾讯消消乐【状压dp】
- 2013腾讯编程马拉松复赛第二场部分题解
- [折半搜索 剪枝 随机化染色] 2015 计蒜之道 复赛 腾讯的星钻增值服务
- 腾讯马拉松复赛第一场1002 吉哥系列故事——乾坤大挪移
- 腾讯马拉松复赛第一场
- [2013腾讯马拉松复赛第一场]HDU 4532 湫秋系列故事——安排座位
- 2013腾讯编程马拉松复赛第三场--威威猫的故事 动态规划算法
- 计蒜客 15971 腾讯消消乐 题解
- 计蒜之道2017F-腾讯消消乐(状压dp)
- HDU 4530 小Q系列故事——大笨钟 2013腾讯编程马拉松复赛第一场第一题
- hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛
- 计蒜客 2017 复赛 腾讯消消乐 状压dp
- 腾讯马拉松复赛第三场