UVA1633 禁止的回文串(狀壓DP)

2022-05-20 08:02:43 字數 1330 閱讀 9705

題意:

輸入正整數n和k(1<=n<=400,1<=k<=10),求長度為n的01串中有多少個不含長度至少為k的回文連續子串。例如,n=k=3時只有4個串滿足條件:001,011,100,110。

分析:做這題的時候走了很多彎路,自以為想到了乙個不用表示狀態的dp,然而在保證不回文的時候就發現了很多問題。其實本題k的規模很小,所以應該要想到狀壓的。乙個串中只要保證不含長度為k也不含長度為k+1的回文串,那麼就不會出現大於k的回文串,所以我們構造的時候只要保證前面兩個條件符合即可。

狀壓記錄後k的字串,填新字元時保證不會構造出長度為k或k+1的回文串即可。

**如下:

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 410

8#define maxd 3010

9#define mod 1000000007

1011

intf[maxn][maxd];

1213

bool check(int x,int

kl)14

22return1;

23}2425

intmain()

2634 memset(f,0,sizeof

(f));

35 f[0][0]=1;36

int ans=0;37

for(int i=1;i<=n;i++)

3847

if(i>=k&&check(j&((1

<2)-1),k-2

))48

52int now=(j&((1

<1))*2;53

if(p0) f[i][now]=(f[i][now]+f[i-1][j])%mod;

54 now=((j&((1

<1))*2)+1;55

if(p1) f[i][now]=(f[i][now]+f[i-1][j])%mod;56}

57}58for(int i=0;i<=(1

<1)-1;i++)

59 ans=(ans+f[n][i])%mod;

60 printf("

%d\n

",ans);61}

62return0;

63 }

uva1633

這題沒有特判k=1的情況導致wa了很久,可能是我的**風格太渣的問題tat。

2016-03-04 13:25:02

1633 核桃的數量

1633 核桃的數量 description 歷屆試題 核桃的數量 時間限制 1.0s 記憶體限制 256.0mb 問題描述 小張是軟體專案經理,他帶領3個開發組。工期緊,今天都在加班呢。為了鼓舞士氣,小張打算給每個組發一袋核桃 據傳言能補腦 他的要求是 1 各組的核桃數量必須相同。2 各組內必須能...

android EditText禁止輸入的幾種做法

1 把edittext的enable屬性設定成false 2 禁止edittext獲取焦點,如 minputview.setfocusable false minputview.setfocusableintouchmode false 解除限制 minputview.setfocusable tr...

禁止滑動的ViewPager

viewpager非常好用,但有時候需要在viewpager的裡面再嵌入viewpager,那麼就有衝突了,簡單粗暴的方法就是直接把乙個viewpager禁止滑動。注意 禁止滑動的同時不能禁止 setcurrentitem 方法。實現思路 重寫viewpager,覆蓋 ontouchevent 和 ...