题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式。

这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacci 所举的例子:一个人每次能够跨一或二阶台阶,问到 n 阶台阶有几种跨法。理念是一样的,只不过跨得台阶数可能会变而已。根据 Fibonacci 数列类比过来,每次最多能传 m 人,则 A [ i ] = A [ i - m ] + A [ i - m + 1 ] +  …… + A [ i - 1 ] , 表示传到第 i 人的情况可能是传到前面 1 ~ m 人后经一步传来的,而前面项不足 m 的则都是由前面所有项累加得到的。

是的,思路并没有问题,但是我还是 WA 了好多发,于是我找了个 AC 代码把所有解的情况打表出来找不同,终于发现了当有超过一人,而最多可向后传 0 人时,即消息不能向后传的时候,是不可能传到最后的,值是 0 ,但是不能忽略如果一开始只有一人,那么他本身就是最后一人,即使 m = 0 ,即不能向后传消息了,这时队尾的人也就是他自己也还是知道这个消息的,所以值是 1 。

至此,我的递推就圆满 AC 了。但是这道题却的确还有 DP 的做法,即每当消息传到某个人的可能情况数增加时,那么这些情况下他同样可以再将消息一步传给他后面的第 1 ~ m 个人,这样,遍历到最前面的 m 个人时每次 dp 值 ++ ,代表从开始点一步到该点的情况,而后面的则只需要传递种类数就行。

递推代码:

 #include<stdio.h>
#include<string.h> int a[],M,N; int sum(int x,int y){
int i,s=;
for(i=x;i<=y;i++){
s+=a[i];
}
return s;
} void fun(){
a[]=;
a[]=;
int i;
for(i=;i<=M;i++){
a[i]=sum(,i-);
}
for(i=M+;i<=N;i++){
a[i]=sum(i-M,i-);
}
return;
} int main(){
while(scanf("%d%d",&N,&M)!=EOF&&(N!=||M!=)){
if(M==){
if(N==)printf("1\n");
else printf("0\n");
}
else {
fun();
printf("%d\n",a[N]);
}
}
return ;
}

DP 代码:

 #include<stdio.h>
#include<string.h> int a[],M,N; int main(){
while(scanf("%d%d",&N,&M)!=EOF&&(N!=||M!=)){
int i,j;
memset(a,,sizeof(a));
a[]=;
for(i=;i<=N;i++){
if(i-<=M){
a[i]++;
}
for(j=;j<=M&&i+j<=N;j++){
a[i+j]+=a[i];
}
}
printf("%d\n",a[N]);
}
return ;
}

hdu 1723 DP/递推的更多相关文章

  1. HDU 5366 dp 递推

    The mook jong Accepts: 506 Submissions: 1281 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...

  2. hdu2089(数位DP 递推形式)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. hdu 2604 Queuing(dp递推)

    昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...

  4. HDU 2154 跳舞毯 | DP | 递推 | 规律

    Description 由于长期缺乏运动,小黑发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥. 小黑买来一块圆形的毯子,把它们分成三等分,分别标上A,B,C,称之为“跳舞毯”,他的运动方式是 ...

  5. HDU 3469 Catching the Thief (博弈 + DP递推)

    Catching the Thief Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. hdu 2050 折线分割平面 dp递推 *

    折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  7. HDU 6076 Security Check DP递推优化

    Security Check Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

  8. HDU 4747 Mex 递推/线段树

    题目链接: acm.hdu.edu.cn/showproblem.php?pid=4747 Mex Time Limit: 15000/5000 MS (Java/Others)Memory Limi ...

  9. HDU5965 扫雷 —— dp递推

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5965 题解: 1. 用a[]数组记录第二行的数字,用dp[]记录没一列放的地雷数.如果第一列的地雷数d ...

随机推荐

  1. 拓扑排序 Topological Sort

    2018-05-02 16:26:07 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中都在v前.例如,图形的顶点可以表示要执行的任 ...

  2. Confluence 6 管理多目录

    这个页面描述了如果在 Confluence 中定义了多个目录服务器将会发生什么样的情况.例如你可能会有一个内部目录服务器同时你还可能有连接一个 LDAP 外部服务器或者使用多种类型的其他用户目录.当你 ...

  3. VS2010-自定义控件

    1.自定义控件 (1)新建—项目,项目模板选择“类库”,取名smControl,填写项目文件保存目录,点击确定 (2)完成后在解决方案资源管理器中删除类Class1 (3)添加“用户控件”——在解决方 ...

  4. OAF点击事件对页面组件的Required属性不验证

    在实际的需求中,OAF页面上很多字段设置了Required=YES,但是我们在点击某些按钮的时候,并不希望浏览器对其进行验证,可以通过设置 Disable Server Side Validation ...

  5. Oracle数据库的“健康指示器”——事件(events)

    Oracle数据库“赢在”在架构,这话还是有道理的,除了锁(lock)这个最大的架构上的“赢点”之外,Oracle事件(event)也是另外一个很重要的架构上的“赢点”,因为当今的Oracle数据库, ...

  6. 未能加载文件或程序集“LinqToExcel”或它的某一个依赖项。试图加载格式不正确的程序。

    未能加载文件或程序集“*”或它的某一个依赖项.试图加载格式不正确的程序. 原因:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题解决方案一:如果是64位机器,IIS—— ...

  7. anaconda环境变量+修改jupyter默认路径

    手贱在安装的时候没有点添加环境变量 安装好后,用anaconda prompt运行一些程序命令之类都是可以的,但是直接打开cmd就不行了,为了省事,所以决定手动添加环境变量, %\ProgramDat ...

  8. Win10取消密码

       

  9. 如何用SPY++工具查看窗体的句柄

    我安装的是vs2012,先找到SPY++工具打开 打开方式: 方式1:通过路径(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microso ...

  10. httpclient httpclient使用连接池

    httpclient使用连接池 http协议是无状态的,但毕竟是基于tcp的,底层还是需要和服务器连接的, 对于需要从同一个站点抓取大量网页的程序,应该使用连接池,否则每次抓取都和web站点建立连接, ...