标签:ace ++ names style block 数组 text script input
4 5 0
3 8 Hint:对于第一个样例,当n为4的时候,我们满足条件的有 UUUU LUUU UUUL 三种情况
这题就有点水了,一开始想找规律,结果找了半天也没啥规律。
我也是看了一下别人的代码才搞懂的。
思路:递推吧,因为每一个情况都是由前一个情况转变过来的,所以用一个dp数组去存每个情况相应的值,每一层的意思如下:(i为当前序列的长度)
dp[i][0]没有三个连续U的序列最右边为L
dp[i][1]没有三个连续U的序列最右边有一个U
dp[i][2]没有三个连续U的序列最右边有两个连续的U
dp[i][3]有三个连续的U的序列
结合每个情况可以发现
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define ll long long int 5 using namespace std; 6 ll dp[35][4]; 7 int main(){ 8 dp[1][0]=dp[1][1]=1; 9 dp[1][2]=dp[1][3]=0; 10 for(int i = 2; i < 33; i ++) { 11 dp[i][0] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]; 12 dp[i][1] = dp[i-1][0]; 13 dp[i][2] = dp[i-1][1]; 14 dp[i][3] = dp[i-1][3]*2 + dp[i-1][2]; 15 } 16 int m; 17 while(scanf("%d",&m)&&m){ 18 printf("%d\n",dp[m][3]); 19 } 20 return 0; 21 }
标签:ace ++ names style block 数组 text script input
原文地址:http://www.cnblogs.com/zllwxm123/p/7260287.html