UVA1638 杆子的排列 Pole Arrangement_dp题解
好久没写题解了,今天心情好,,来写一发
这道题是UVA上的题目。众所周知,UVA很卡,所以我实在洛谷上提交的^_^。 //p.s.洛谷真好用
题意:一个队列中只能放入U和L,问存在连续3个以上U(危险组合)的个数为几个。
思路:这道题中如果直接算有几组存在连续3个以上U的数量, 不是特别的方便,~~所实话就是我不会~~……
所以可以考虑 _总组合数-安全组合=危险组合_ 的反向思路来做,这样就很容易地写出了dp的状态转移方程:
dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
之后的代码就很好实现了!
1 #include<bits/stdc++.h>//万能头文件 2 using namespace std; 3 typedef long long ll; 4 const int INF=0x3f3f3f3f; 5 const int Maxn=110; 6 int n,ans; 7 int dp[Maxn]; 8 int main(){ 9 while(scanf("%d",&n)!=EOF && n){ //不停地读入 10 memset(dp,0,sizeof(dp)); 11 dp[1]=2; 12 dp[2]=4; 13 dp[3]=7; 14 for(int i=4;i<=n;i++){ 15 dp[i]=dp[i-1]+dp[i-2]+dp[i-3]; //状态转移 16 } 17 ans=pow(2,n)-dp[n]; //最后减一下,答案就出来了 18 printf("%d\n",ans); 19 } 20 return 0; 21 }