noi 2.6_9270&poj 2440DNA(DP)

Posted konjac蒟蒻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了noi 2.6_9270&poj 2440DNA(DP)相关的知识,希望对你有一定的参考价值。

题意:问长度为L的所有01串中,有多少个不包含"101"和"111"的串。

解法:f[i][j]表示长度为i的01串中,结尾2位的十进制数是j的合法串的个数。那么,便由f[i-1][ ]逐个推出。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 #define L (int)1e6+10
 7 #define mod 2005
 8 int f[L][6];
 9 
10 int main()
11 {
12     int l;
13     scanf("%d",&l);
14     f[0][0]=f[0][4]=1,f[0][1]=f[0][2]=f[0][3]=0;
15     for (int i=1;i<=l;i++)
16     {
17       f[i][0]=(f[i-1][0]+f[i-1][2])%mod;
18       f[i][2]=(f[i-1][1]+f[i-1][3])%mod;
19       
20       f[i][1]=f[i-1][0];
21       f[i][3]=f[i-1][1];
22       f[i][4]=(f[i][0]+f[i][1]+f[i][2]+f[i][3])%mod;
23     }
24     printf("%d\\n",f[l][4]);
25     return 0;
26 }
View Code 1

优化:g[i]直接表示长度为i的01串中合法串的个数。由基本的二维式子逐层递推便可推出。
             g[i]=f[i][0]+f[i][1]+f[i][2]+f[i][3]
f[i-1][]:       =[0]*2+[1]*2+[2]+[3]
                  =g[i-1]+[0]+[1]
f[i-2][]:                  =[0]+[2]+[0]
f[i-3][]:                  =[0]+[2]+[1]+[3]+[0]+[2]
                             =g[i-3]+[0]+[2]
f[i-4][]:                  =[0]+[2]+[1]+[3]
                              =g[i-4]
即:g[i]=g[i-1]+g[i-3]+g[i-4];

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 #define L (int)1e6+10
 7 #define mod 2005
 8 int f[L];
 9 
10 int main()
11 {
12     int l;
13     scanf("%d",&l);
14     f[1]=2,f[2]=4,f[3]=6,f[4]=9;
15     for (int i=5;i<=l;i++)
16       f[i]=(f[i-1]+f[i-3]+f[i-4])%mod;
17     printf("%d\\n",f[l]);
18     return 0;
19 }
View Code 2

 

以上是关于noi 2.6_9270&poj 2440DNA(DP)的主要内容,如果未能解决你的问题,请参考以下文章

noi 2.6_9289&bzoj2023 / 1630Ant Counting 数蚂蚁{Usaco2005 Nov}

noi 2.6_9280&bzoj 1089严格n元树(DP+重载运算符)

noi 2.6_9288&hdu 1133Buy the Ticket(DP / 排列组合 Catalan+高精度)

[Mini2440 - 011] 配置编译 linux-2.6 内核

noi 2.6_90滑雪(DP)

noi 2.6_747Divisibility(DP)