DP 小好的年少(简单DP)

题目:
小好牵着小坏的手走在樱花飞舞的校园里,这时候小好回忆起了他和小坏小时候一起玩的一个游戏—-丢手绢,无限怀念,于是他和小坏叫上小真和小假以及其他情侣(fffffff)在房间里继续玩起了这个好玩的游戏,不过既然他们都是某挖石油高校的好孩子了,怎么能够玩规则这么low的游戏呢?多捞哦,于是他们改良升级出了一个改良版的丢手绢Level2,规则是这样的,有n个好孩子围成一个圈,编号从1到n,n的下一位是1,1的下一位是2,依次类推,现在有一个god从第1个孩子(初始位置)开始丢手绢,god在下一步只能丢到当前孩子的上一个位置或者下一个位置,比如当前位置是2,现在只能丢到1或者3,并且需要花费一点体力,现在有n个孩子,现在问god刚好花费m点体力,刚好回到初始位置的方案数有多少中,比如样例中的3 3,1->3->2->1,1->2->3->1,那么god刚好花掉3点体力,并且刚好回到初始位置。

输入一行,两个整数,n和m,分别代表孩子的数量以及god需要花费的体力
输出方案数

题解:
DP[i][j]代表有i点体力时从j出发的方案数,因为是环状,特判首尾。

代码:
int dp[1050][1050];
int main()
{
int n,m,i,j;
while(~scanf(“%d%d”,&n,&m))
{
memset(dp,0,sizeof(dp));
dp[0][1]=1;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(j==1)
dp[i][j] = dp[i][j]+dp[i-1][2]+dp[i-1][n];
else if(j==n)
dp[i][j] = dp[i][j]+dp[i-1][1]+dp[i-1][n-1];
else
dp[i][j] = dp[i][j]+dp[i-1][j-1]+dp[i-1][j+1];
}
}
printf(“%d\n”,dp[m][1]);
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41243063/article/details/81382036
DP
DP?