bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛*

Posted YuanZiming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛*相关的知识,希望对你有一定的参考价值。

bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛

题意:

n头奶牛,每头有一个编号,求有多少种排列顺序使得相邻两头奶牛的编号差不超过k。n≤16。

题解:

状压dp。f[i][S]表示已选状态为S,上一个选的是i,满足要求的方案数,则f[i][S]=sum(f[j][S|j]),abs(num[i]-num[j])≤k。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define inc(i,j,k) for(int i=j;i<=k;i++)
 5 #define ll long long
 6 #define INF 0x3fffffff
 7 using namespace std;
 8 
 9 ll dp[20][80000]; int n,k,s[20];
10 ll dfs(int x,int y){
11     if(!y)return 1; if(dp[x][y]!=-1)return dp[x][y]; dp[x][y]=0;
12     inc(i,1,n)if((y&(1<<(i-1)))&&abs(s[i]-s[x])>k)dp[x][y]+=dfs(i,y^(1<<(i-1)));
13     return dp[x][y];
14 }
15 int main(){
16     scanf("%d%d",&n,&k); inc(i,1,n)scanf("%d",&s[i]); memset(dp,-1,sizeof(dp));
17     s[0]=-INF; printf("%lld\n",dfs(0,(1<<n)-1)); return 0;
18 }

 

20160908

以上是关于bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛*的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛*

bzoj 1231 [Usaco2008 Nov]mixup2 混乱的奶牛

BZOJ1231[Usaco2008 Nov]mixup2 混乱的奶牛 状压DP

bzoj1231 [Usaco2008 Nov] mixup2 混乱的奶牛

bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛

BZOJ 1231 [Usaco2008 Nov]mixup2 混乱的奶牛:状压dp + 滚动数组