点击这里查看原题
f[i][j]表示状态为i,以奶牛j结尾的情况数
/*
User:Small
Language:C++
Problem No.:1231
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=(1<<16)+5;
int a[20],n,t;
ll f[M][20],ans;
int main(){
freopen("data.in","r",stdin);//
scanf("%d%d",&n,&t);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
f[1<<i][i]=1;
}
for(int i=0;i<(1<<n);i++)
for(int j=0;j<n;j++){
if((i&(1<<j))==0) continue;
for(int k=0;k<n;k++)
if((i&(1<<k))==0&&abs(a[j]-a[k])>t) f[i|(1<<k)][k]+=f[i][j];
}
for(int i=0;i<n;i++) ans+=f[(1<<n)-1][i];
printf("%lld\n",ans);
return 0;
}

本文介绍了一种使用状态压缩动态规划解决特定组合计数问题的方法。通过定义f[i][j]来表示状态为i且以第j头奶牛结尾的情况数量,并通过迭代填充表格来找出所有可能的组合情况。
375

被折叠的 条评论
为什么被折叠?



