您的位置:首页 > 其它

计蒜之道复赛 腾讯消消乐

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: