Input
The first line contains an integer n (1?≤?n?≤?24). The following line contains n integers: a1,?a2,?...,?an (1?≤?ai?≤?109).
Output
Output a single integer — the answer of Iahub‘s dilemma modulo 1000000007 (109?+?7).
Input
3In the second case, note that it is possible that two different ways have the identical set of stopping. In fact, all six possible ways have the same stops: [2, 4, 6], so there‘s no bad luck for Iahub.
题目链接:http://codeforces.com/contest/327/problem/E
题目大意:给一个序列,可以任意重排,但是前缀和不能出现给定数字中的数,问有几种排列方式
题目分析:n小于等于24,毕竟是cf,跑的快,状压搞一下,sum数组记录状态,即有哪些数字被选了(1表示被选),这样就可以简单的枚举全排列的状态了,用dp记下数,注意这里还需要用lowbit优化来降低复杂度
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lowbit(x) (x & (-x))
#define ll long long
using namespace std;
int const MOD = 1e9 + 7;
int const MAX = (1 << 24) + 1;
ll sum[MAX], dp[MAX];
int a[MAX], no[2];
int main()
{
int n, k;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
sum[1 << i] = a[i];
}
scanf("%d", &k);
for(int i = 0; i < k; i++)
scanf("%d", &no[i]);
dp[0] = 1;
for(int i = 1; i < (1 << n); i++)
{
sum[i] = sum[i & ~lowbit(i)] + sum[lowbit(i)];
if(sum[i] == no[0] || sum[i] == no[1])
continue;
for(int j = i; j != 0; j -= lowbit(j))
{
dp[i] += dp[i & ~lowbit(j)];
if(dp[i] > MOD)
dp[i] -= MOD;
}
}
printf("%I64d\n", dp[(1 << n) - 1]);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Codeforces 327E Axis Walking (状压dp lowbit优化)
原文:http://blog.csdn.net/tc_to_top/article/details/47162427