第五周训练赛1--C题
2014-08-11 20:15
148 查看
虽然已经被提示是动态规划,但找了半天仍然不能确定状态和转移方程。
后面看了题解后,才明白该怎么做的。
首先选取状态为dp(i,j,k)表示前i个数中和为j末尾状态为k(k可取0,1)的方案数目,
然后就可以写出状态方程了:
dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];
dp[i][j][1]=dp[i-1][j][0]
dp[i][j][1]+=dp[i-1][j-1][1]
然后就可以写代码了。
代码如下:
后面看了题解后,才明白该怎么做的。
首先选取状态为dp(i,j,k)表示前i个数中和为j末尾状态为k(k可取0,1)的方案数目,
然后就可以写出状态方程了:
dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];
dp[i][j][1]=dp[i-1][j][0]
dp[i][j][1]+=dp[i-1][j-1][1]
然后就可以写代码了。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { int t,n,k,i,j,cnt; int dp[110][110][2]; cin>>t; while(t--) { cin>>cnt>>n>>k; for(i=0;i<=k;i++) dp[1][i][0]=dp[1][i][1]=0; dp[1][0][0]=dp[1][0][1]=1; for(i=2;i<=n;i++) for(j=0;j<=k;j++) { dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1]; dp[i][j][1]=dp[i-1][j][0]; dp[i][j][1]+=dp[i-1][j-1][1]; } int ans=dp [k][0]+dp [k][1]; cout<<cnt<<" "<<ans<<endl; } return 0; }
相关文章推荐
- 第五周训练赛1--E题
- 第五周训练赛2--B题
- 第五周项目1-建立链栈算法库
- Coursera Machine Learning 第五周 quiz Programming Exercise 4: Neural Networks Learning
- 寒假训练赛(三) 自我总结
- 【菌菌】【C语言MOOC】第五周 分解质因数(10分)
- 第五周:35. Search Insert Position
- 第五周:[leetcode] Two Sum、3Sum、3Sum Closest、4Sum
- 第五周
- 20155220 2016-2017-2《Java程序设计》第五周学习总结
- 第五周
- # 20155204 2016-2017-2 《Java程序设计》第五周学习总结
- [3.30校内训练赛]
- 20162325金立清第五周作业
- 学习笔记第五周——嵌套if语句之排位大小
- 训练赛---分球
- SDUT 2017 春夏组队训练赛11 2017 6 10
- SDKD 2017 Summer Single Training #02 (训练赛2)
- TJU训练赛—B
- HDU-2017 多校训练赛1-补题