Codeforces Round #191 (Div. 二) E. Axis Walking (状态压缩+lowbit应用)
Codeforces Round #191 (Div. 2) E. Axis Walking (状态压缩+lowbit应用)
大致题意:
24项的数列,求有多少种排列使a1+a2+...+an的过程中不会产生b1和b2
大致思路:
状态压缩,每个状态表示这些项有多少种排列不会产生b1和b2
所以有:
for(int i = 0; (1<<i) <= mask; i++){
if( ((1<<i)&mask) == 0) continue;
dp[mask] += dp[ mask&(~(1<<i)) ];
}
复杂度是:
(1<<24)*24,复杂度太高
用lowbit优化,就不需要把i逐项移动找1了
复杂度接近(1<<24)*24/2
会优化一半,新技能get
////GNU C++11 Accepted 1278 ms 197000 KB //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <string> #include <vector> #include <cstdio> #include <ctime> #include <bitset> #include <algorithm> #define SZ(x) ((int)(x).size()) #define ALL(v) (v).begin(), (v).end() #define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i) #define REP(i,n) for ( int i=1; i<=int(n); i++ ) using namespace std; typedef long long ll; #define X first #define Y second typedef pair<int,int> pii; template <class T> inline bool rd(T &ret) { char c; int sgn; if (c = getchar(), c == EOF) return 0; while (c != '-' && (c<'0' || c>'9')) c = getchar(); sgn = (c == '-') ? -1 : 1; ret = (c == '-') ? 0 : (c - '0'); while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return 1; } template <class T> inline void pt(T x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) pt(x / 10); putchar(x % 10 + '0'); } const int MOD = 1e9+7; const int N = 30; int b[N]; int dp[(1<<24)+5]; ll sum[(1<<24)+5]; inline int lowbit(int x){ return x&(-x);} int main(){ b[1] = b[2] = -1; int n,m; rd(n); for(int i = 0; i < n; i++) rd(sum[1<<i]); rd(m); REP(i,m) rd(b[i]); int all = (1<<n)-1; dp[0] = 1; REP(mask,all){ if(sum[mask] == 0) sum[mask] = sum[mask-lowbit(mask)] + sum[lowbit(mask)]; if(sum[mask] == b[1] || sum[mask] == b[2]) continue; ll t = 0; for( int tmp = mask; tmp ;tmp -= lowbit(tmp)) t += dp[mask-lowbit(tmp)]; dp[mask] = t%MOD; } printf("%d\n",(int)dp[all]); }
版权声明:本文为博主原创文章,未经博主允许不得转载。