失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 题目-火影-鸣人-查克拉分配给分身(详解)

题目-火影-鸣人-查克拉分配给分身(详解)

时间:2020-11-09 22:20:07

相关推荐

题目-火影-鸣人-查克拉分配给分身(详解)

一、首先考虑一下基本情况:

该三种情况下始终只有一种情况,即K=1。

二、 当查克拉能量数量小于分身数量时

易知x个查克拉能量,最多给x个分身分配能量,多余的分身都只能为0查克拉能量。

所以多出来的分身无论有多少都不会影响分配情况K的大小。即当查克拉能量小于分身数量时,K的大小始终和查克拉等于分身数量时的K的大小。

三、建立一个二维数组dp[11][11]

dp[ x ][ y ]代表在x个查克拉能量和y个分身时的分配情况K的数目。

此时结合上面讲的第二点,可得该代码

if(x<y){dp[x][y]=dp[x][x];}

四、当查克拉能量大于分身数量时(x个查克拉能量,y个分身)

该情况我们可以分为两种情况来看

1、有一个分身始终为0不分配能量

2、全部分身必须有能量

这两种情况加起来就是全部情况。

先看第一种情况,因为有一个分身不分配,所以该情况就可以转换为x个查克拉能量,y-1个分身时分配方式数量。再结合数组,此时的K就是dp[ x ][ y-1 ];

再看第二种情况,因为该情况下的分身必须都有能量,所以有y个查克拉能量固定分配,一个分身一个,我们不能动。此时我们的能量就剩下了x-y个查克拉能量,所以该情况就可以转换为x-y个查克拉分配给y个分身时的分配方式数量。结合数组,此时的K就是dp[ x-y ][ y ]

综上,当查克拉能量大于分身数量时,K为dp[ x ][ y-1 ]+dp[ x-y ][ y ]

所以有如下代码

if(x>y){dp[x][y]=dp[x][y-1]+dp[x-y][y];}

五、题解代码

这题我们可以先求出0-10个查克拉分给0-10个分身时的所有K,然后再根据输入的M,N给出对应数据。

#include<iostream>using namespace std;int main(){int dp[11][11];for(int i=1;i<11;i++)//对应第一步的基本情况初始化,其他情况的K均由这些基本情况推出{dp[0][i]=dp[1][i]=dp[i][1]=1;}for(int x=2;x<11;x++)//遍历剩下的情况,开始求K{for(int y=2;y<11;y++){if(x<y)//对应第二部分,查克拉小于分身{dp[x][y]=dp[x][x];}else//查克拉大于等于分身{dp[x][y]=dp[x][y-1]+dp[x-y][y];}}}int t;cin>>t;while(t--)//t个测试数据{int M,N;cin>>M>>N;cout<<dp[M][N]<<endl;//输出对应数目即可}return 0;}

如果觉得《题目-火影-鸣人-查克拉分配给分身(详解)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。