第五周训练赛1--C题

来源:互联网 发布:python双击闪退 编辑:程序博客网 时间:2024/06/05 21:04

虽然已经被提示是动态规划,但找了半天仍然不能确定状态和转移方程。

后面看了题解后,才明白该怎么做的。

首先选取状态为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[n][k][0]+dp[n][k][1];           cout<<cnt<<" "<<ans<<endl;     } return 0;} 


0 0
原创粉丝点击