动态规划学习系列——划分DP(二)

划分型DP第二题,wikioi 1039,与第一题乘积最大思路有所不同。

题目要求:

将一个数划分成几部分,问一共有多少种分法。

真 · 解题思路

其实跟小学奥赛的一些题有点像,我们先来看一个例子:

7 分成 3 部分,有四种办法:

1,1,5;1,2,4;1,3,3;2,2,3 。

我们人脑来考虑问题的时候是怎么想的呢?显然,从1开始,1是第1部分,然后剩下6分成2部分,我们依然是从1开始考虑,1是第2部分,然后5是第3部分;同样接下来考虑第2部分是2,则第3部分是4;接着考虑第2部分是3,第3部分是3;因为每一部分不能比前面的部分小(避免重复),所以1为第1部分的就考虑完了,然后考虑第1部分是2,同理,从第2部分是2开始,于是只有2,3这种情况。

上述人脑思路有点像搜索,这也是为什么我喜欢深搜算法的原因。

但是,现在我们不想用搜索来做,而是用动态规划来做,我们又该怎么考虑呢?

某大牛的名言:动态规划 == 记忆化搜索

我们又知道,动态规划是用上一个状态来推出当前状态的,那么我们可以这么来考虑:单独把第1部分拿出来,考虑第1部分的所有情况以及对应的所有剔除第一部分分成m-1部分的情况,于是,有状态转移方程

dp[i][j] = ∑dp[i-k][j-1] ( 1 <= k <= j/i )

也可以化简一下,因为dp[i-1][j-1] = ∑dp[i-k-1][j-1]:

dp[i][j] = dp[i-1][j-1] + dp[i-j][j]

这个公式可以理解为:先单独考虑第1部分是1,剩下的第1部分必定大于1,所以每一部分都减1也无妨,这个值也是我们知道的!

代码:

#include <bits/stdc++.h>

using namespace std;

int n,m,dp[205][10];

int main()
{
    scanf("%d %d",&n,&m);
    dp[0][0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(j<=i)
                dp[i][j]=dp[i-j][j]+dp[i-1][j-1];
        }
    }
    printf("%d\n",dp[n][m]);

    return 0;
}

总结:

1、虽说编程得站在机器的角度,但偶尔用人脑跑跑也不错;

2、动态规划就是记忆化的深搜;

3、记得不要考虑重复了!

时间: 2024-08-09 19:53:57

动态规划学习系列——划分DP(二)的相关文章

动态规划学习系列——划分DP(三)

划分DP第三题,wikioi 1040,送我n个WA~~~ 题目大意: 这道题题述有着UVA的特色,够废话,其实就是读入一个长度最大200的字符串(不知道为何要分行输入,完全没有意义啊),分成m部分,使各部分单词量加起来最大 解题思路: 这题划分的部分跟乘积最大那题其实很像,状态转移方程也很容易想到: dp[i][k]=max(dp[i][k],dp[j][k-1]+scnt[j+1][i]) ( j >= k-1 ) scnt数组:scnt[j][i] 表示区间 j~i 所包含的单次总数 接下

动态规划学习系列——划分DP(一)

划分型DP,是解决跟划分有关的题目的一种DP思路,个人觉得,是目前接触的DP类型中最难的一种,因为感觉思路并不确定,不过正是不确定,才可以体会到算法的精妙之处. 题目链接:wikioi_1017 要求是将一个n位的数分成m部分,使各部分的乘积最大.解题的思路基于一个事实:当前的数可以分成m-1部分,那么加多几位分成m部分不是可以从原来的推出来.从这句差不多是废话的话中我们就可以推出状态转移方程: dp[i][k]=max(dp[i][k],dp[j][k-1]*a[j+1][i]); ( k <

quick-cocos2d-x 学习系列之十二 关于websocket

quick-cocos2d-x 学习系列之十二 关于websocket 1.  概念 百度百科:WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可

Deep Learning(深度学习)学习系列之(二)

Deep Learning(深度学习)学习笔记整理系列 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 4)阅读本文需要机器学习.计算机视觉.神经网络等等基础(如果没有也没关系了,没

Dubbo学习系列之十二(Quartz任务调度)

Quartz词义为"石英"水晶,然后聪明的人类利用它发明了石英手表,因石英晶体在受到电流影响时,它会产生规律的振动,于是,这种时间上的规律,也被应用到了软件界,来命名了一款任务调度框架--Quartz.现实软件逻辑中,周期任务有着广泛的存在,如定时刷新配置信息,定期盘点库存,定时收发邮件等,至于定时任务处理,也有Spring的ScheduledThreadPool,还有基于注解@Scheduled的方式,ScheduledThreadPool主要是基于相对时间,不方便控制,而@Sche

WP8.1学习系列(第二十二章)——在页面之间导航

在本文中 先决条件 创建导航应用 Frame 和 Page 类 页面模板中的导航支持 在页面之间传递信息 缓存页面 摘要 后续步骤 相关主题 重要的 API Page Frame NavigationCacheMode 本主题将讨论基本的导航概念,并演示如何创建一个在两个页面之间进行导航的应用. 有关为你的应用选择最佳导航模式的帮助,请参阅导航模式. 在操作时请参阅平面导航和分层导航模式,它们是应用功能大全系列的一部分. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual

WP8.1学习系列(第十二章)——全景控件Panorama开发指南

2014/6/18 适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1 全景体验是本机 Windows Phone 外观的一部分.与旨在适合手机屏幕边界的标准应用不同,全景应用通过使用超出屏幕边界的长水平画布提供了一个查看控件.数据和服务的独特方式.这些固有的动态视图使用分层动画和内容,以便各层以不同的速度流畅地平移,类似于视差效果. 本主题包括以下部分. 全景控件概述 导航支持 全景应用功能 相关

Dubbo学习系列之十三(Mycat数据库代理)

软件界有只猫,不用我说,各位看官肯定知道是哪只,那就是大名鼎鼎的Tomcat,现在又来了一只猫,据说是位东方萌妹子,暂且认作Tom猫的表妹,本来叫OpencloudDB,后又改名为Mycat,或许Cat更亲切?那现在就来认识下这只小猫吧. 数据库的核心地位就不说了,但现在的问题是,各种RDB,各种NoSQL交织,又是分布式.多租户的场景下,心里有没有十足的把握能稳住如此局面呢.有需求,就有市场!自然,相应的技术也应运而生,Mycat作为一款DB中间件,可以作为应用和DB间的“桥梁”,让后台DB的

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU