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 }

 

posted @ 2019-03-05 18:34  pengcheng_official  阅读(118)  评论(0编辑  收藏  举报