SPOJ GNYR09F 数字上的找规律DP
2014-08-11 15:06
197 查看
Problem C SPOJ GNYR09F
dp题,dp可能刚刚开始对大家来说比较难,但是静下心来分析还是比较简单的;
dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的方案数。
考虑第i个位置的2种情况:
1.放0:dp(i,j,0) = dp(i-1,j,0) + dp(i-1,j,1)
2.放1:dp(i,j,1)= dp(i-1,j,0)
因为每一行最开始的状态均从i=j+1,dp(i,j,0)=0,dp(i,j,1)=1开始的,但因为这样子开头均为1,那些除此之外的情况的要从上一层算下来就是
dp(i,j,1) += dp(i-1,j-1,1)
如果还有j>=1,dp(i,j,1) += dp(i-1,j-1,1)
dp题,dp可能刚刚开始对大家来说比较难,但是静下心来分析还是比较简单的;
dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的方案数。
考虑第i个位置的2种情况:
1.放0:dp(i,j,0) = dp(i-1,j,0) + dp(i-1,j,1)
2.放1:dp(i,j,1)= dp(i-1,j,0)
因为每一行最开始的状态均从i=j+1,dp(i,j,0)=0,dp(i,j,1)=1开始的,但因为这样子开头均为1,那些除此之外的情况的要从上一层算下来就是
dp(i,j,1) += dp(i-1,j-1,1)
如果还有j>=1,dp(i,j,1) += dp(i-1,j-1,1)
#include<cstdio> #include<cstring> using namespace std; #define N 101 int dp [2]; int main() { int T,a,b,c; scanf("%d",&T); while(T--){ scanf("%d%d%d",&a,&b,&c); memset(dp,0,sizeof(dp)); dp[1][0][0]=1,dp[1][0][1]=1; for(int i=0;i<=c;i++) dp[i+1][i][1]=1; for(int i=0;i<=c;i++){ for(int j=i+2;j<=b;j++){ dp[j][i][0]=dp[j-1][i][0]+dp[j-1][i][1]; dp[j][i][1]=dp[j-1][i][0]; if(i>=1) dp[j][i][1]+=dp[j-1][i-1][1]; } } printf("%d %d\n",a,dp[b][c][0]+dp[b][c][1]); } return 0; }
相关文章推荐
- [noip2013]小朋友的数字(dp+规律)
- spoj10606 数位dp (求出现的数字,所有偶数出现奇数次,所有奇数出现偶数次)
- 数字难题(找规律)
- codeforces215E(数位DP,规律水过)
- 【数位dp入门】51nod 1009 数字1的数量
- openOJ 2045 分解数字(DP)
- HDU 4722 Good Numbers(找规律+数位DP)
- POJ1163 数字三角形 经典DP题目
- number number number (数字规律)
- 数位dp 等凹数字 (未完成)
- BZOJ 1833: [ZJOI2010]count 数字计数 [数位DP]
- 51Nod-1354 选数字(dp,思路)
- 2016 大连 K Guess the number HDU 5981 DP 打表找规律
- 打印有变化规律的一组数字正方形。
- DP经典应用(一)数字三角形问题
- ZOJ3872 Beauty of Array---规律 | DP| 数学能力
- 找规律填数字
- JZOJ5379. 【NOIP2017提高A组模拟9.21】Victor爱数字 数位DP
- 四、从数字中发现规律?
- 【递归】数字三角形 简单dp