题意:问长度为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 ",f[l][4]); 25 return 0; 26 }
优化: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 ",f[l]); 18 return 0; 19 }