2010 ACM-ICPC Multi-University Training Contest(5)HDU3485Count 101题解动态规划DP

Count 101

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 400    Accepted Submission(s): 219

Problem Description
You know YaoYao is fond of his chains. He has a lot of chains and each chain has n diamonds on it. There are two kinds of diamonds, labeled 0 and 1. We can write down the label of diamonds on a chain. So each chain can be written as a sequence consisting of 0 and 1.
We know that chains are different with each other. And their length is exactly n. And what’s more, each chain sequence doesn’t contain “101” as a substring.
Could you tell how many chains will YaoYao have at most?
 

 

Input
There will be multiple test cases in a test data. For each test case, there is only one number n(n<10000). The end of the input is indicated by a -1, which should not be processed as a case.
 

 

Output
For each test case, only one line with a number indicating the total number of chains YaoYao can have at most of length n. The answer should be print after module 9997.
 

 

Sample Input
  
    
    
    
    
3 4 -1
 

 

Sample Output
  
    
    
    
    
7 12
Hint
We can see when the length equals to 4. We can have those chains: 0000,0001,0010,0011 0100,0110,0111,1000 1001,1100,1110,1111
 

 

Source
2010 ACM-ICPC Multi-University Training Contest(5)——Host by BJTU
 

 

Recommend
zhengfeng
状态:
d[i][j][k]表示前i个数第i-1个是j第i-2个是k的满足条件的串的个数
状态转移方程:
d[i][k][0]=(d[i][k][0]+d[i-1][j][k])%9997
 d[i][k][1]=(d[i][k][1]+d[i-1][j][k])%9997 (jk!='10')
边界:

d[1][0][0]=d[1][0][1]=1

d[2][j][k]=1

 

代码:

#include int main() { int n; while(scanf("%d",&n),n!=-1) { int i,j,k,ans=0,d[10005][2][2]={0}; d[1][0][0]=d[1][0][1]=1; for(j=0;j<2;j++) for(k=0;k<2;k++) d[2][j][k]=1; for(i=3;i<=n+1;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) if(j==1&&k==0) d[i][k][0]=(d[i][k][0]+d[i-1][j][k])%9997; else { d[i][k][0]=(d[i][k][0]+d[i-1][j][k])%9997; d[i][k][1]=(d[i][k][1]+d[i-1][j][k])%9997; } for(j=0;j<2;j++) for(k=0;k<2;k++) ans=(ans+d[n][j][k])%9997;//刚开始忘了取模,不停WA printf("%d/n",ans); } }

你可能感兴趣的:(ACM题解,training,2010,each,input,equals,output)