日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SPOJ.TLE - Time Limit Exceeded(DP 高维前缀和)

發布時間:2024/8/26 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SPOJ.TLE - Time Limit Exceeded(DP 高维前缀和) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

\(Description\)

給定長為\(n\)的數組\(c_i\)\(m\),求長為\(n\)的序列\(a_i\)個數,滿足:\(c_i\not\mid a_i,\quad a_i\&a_{i+1}=0\)
\(n\leq 50,m\leq 15,0\leq a_i<2^m,0<c_i\leq 2^m\)

\(Solution\)

DP。限制都是與值有關的,所以令\(f_i\)表示以\(i\)這個數結尾的序列\(a\)的個數。

轉移即\(f_i=\sum_{j,i\&j=0}f_j\)\(i\&j=0\)需要\(3^n\)枚舉補集的子集,但是還可以把它寫成\(i\&(\sim j)=i\),即\(i\)\(\sim j\)的子集。
所以先把上一次的DP數組下標反轉,就可以用高維前綴和優化枚舉超集了。

對于\(c_i\not\mid a_i\)的限制,每次轉移完將下標為\(c_i\)倍數的\(f_i\)置為\(0\)即可。

這樣轉移\(n\)次就可以了。復雜度\(O(nm2^m)\)


反轉下標的那種寫法好騷啊。。
還有枚舉子集的方法表示不知道為什么對。。:http://www.cnblogs.com/zwfymqz/p/9911351.html


記一下(我知道的)高維前綴和的兩種形式:

for (int j = 0; j < m; ++j)//必須先枚舉這個 //求超集的和for (int s = 0; s < 1<<m; ++s)if (!(s >> j & 1)) f[s] += f[s | (1 << j)];for (int j = 0; j < m; j++)//子集卷積for (int s = 0; s < 1<<m; ++s)if (s >> j & 1) f[s] += f[s ^ (1 << j)]);
#include <cstdio> #include <cctype> #include <cstring> #include <algorithm> #define gc() getchar() #define mod 1000000000 #define Add(x,v) (x+=v)>=mod&&(x-=mod) typedef long long LL; const int N=(1<<15)+5;inline int read() {int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now; }int main() {static int f[N],tmp[N];for(int T=read(); T--; ){int n=read(),m=read(),lim=(1<<m)-1;memset(f,0,sizeof f);f[0]=1;for(int i=1; i<=n; ++i){ // for(int s=0; s<=lim; ++s) tmp[s^lim]=f[s]; // for(int s=0; s<=lim; ++s) f[s]=tmp[s];for(int s=0; s<=lim; s+=2) std::swap(f[s],f[s^lim]);for(int j=0; j<m; ++j)for(int s=0; s<=lim; ++s)if(!(s>>j&1)) Add(f[s],f[s|(1<<j)]);int ci=read();for(int j=0; j<=lim; j+=ci) f[j]=0;}LL ans=0;for(int i=0; i<=lim; ++i) ans+=f[i];printf("%d\n",(int)(ans%mod));}return 0; }

轉載于:https://www.cnblogs.com/SovietPower/p/10069661.html

總結

以上是生活随笔為你收集整理的SPOJ.TLE - Time Limit Exceeded(DP 高维前缀和)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。