题目描述
将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种划分方案被认为是相同的。
1 1 5
1 5 1
5 1 1
问有多少种不同的分法。

输入描述
输入:n,k (6<n<=200,2<=k<=6)

输出描述
输出:一个整数,即不同的分法。

样例输入
 7 3
样例输出
4

数据范围及提示

四种分法为:1,1,5;1,2,4;1,3,3;2,2,3

分析与解:

看到这道题,应该很快能想到用动态规划来解。想到将dp[i][j]定义为将i分解为j份的方案总数,但是,如何写出状态转移方程呢?我们可以反过来想,假如所有的方案都已经被列出来了,也就是i=a1+a2+a3+...+aj,而且每一个分解出来的数都是大于零的,于是从每一个数里减掉一个1,也就是i-j=(a1-1)+(a2-1)+...+(aj-1),这样,总有一些加数是为0的,那么也就相当于把i-j分解了为了m份,m<=j。这样,把每一个m对应的方案总数加起来,也就刚好等于i分解成j份的方案总数。其实这样已经解决了重复方案的问题,因为,只要m不同,肯定方案不同,这样只要保证最初的子问题都满足没有重复方案的性质,后面推出的结果也不会包含重复的方案。当然,要设置好边界条件。这样就可以写出状态转移方程了。dp[i][j]=dp[i-j][1]+dp[i-j][2]+...+dp[i-j][j],再加上一个合适的初始值,dp[0][1]=1,基本上就正确了。但是,显然这不够好,很容易可以发现:dp[i-1][j-1]=dp[(i-1)-(j-1)][1]+dp[(i-1)-(j-1)][2]+...+dp[(i-1)-(j-1)][j-1],正好就是dp[i][j]=dp[i-j][1]+dp[i-j][2]+...+dp[i-j][j-1],于是就看到dp[i][j]就比dp[i-1][j-1]多了尾巴上的dp[i-j][j],所以,改进后:dp[i][j]=dp[i-1][j-1]+dp[i-j][j],这样,基本上就可以放心了,再把初始的条件设好,dp[0][0]=1,当然i必须大于等于j才有意义,所以,剩余的那部分没有必要计算了。代码如下。

感悟:先把状态想象成不重复的然后想怎么转移

codevs1039整数的k划分-思考如何去重复的更多相关文章

  1. DFS问题举例:N个整数选k个使其和为x

    N个整数选k个使其和为x,若有多个方案,选择元素平方和最大的一个 #include<cstdio> #include<cmath> #include<cstring> ...

  2. js数组和字符串去重复几种方法

    js数组去重复几种方法 第一种:也是最笨的吧. Array.prototype.unique1 = function () { var r = new Array(); label:for(var i ...

  3. 大数据位图法(无重复排序,重复排序,去重复排序,数据压缩)之Java实现

    1,位图法介绍 位图的基本概念是用一个位(bit)来标记某个数据的存放状态,由于采用了位为单位来存放数据,所以节省了大量的空间.举个具体的例子,在Java中一般一个int数字要占用32位,如果能用一位 ...

  4. Js数据去重复,时间更换格式,cookie,localStorage和sessionStorage的使用等通用方法

    一,数组去重复 function unique(arr) { // 遍历arr,把元素分别放入tmp数组(不存在才放) var tmp = new Array(); for (var i in arr ...

  5. mysql数据库去重复

    参考:http://www.cnblogs.com/duanjie/archive/2011/08/13/2136862.html 说到去重复,感觉逻辑很简单.但动手写起来却并不是那么容易.面试的时候 ...

  6. 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表

    前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...

  7. Oracel查询根据部分字段去重复

    一般一个表的id是唯一的,如果除去id则会有重复数据,有时做项目时查询要求根据某几个字段去掉重复记录,并且查询保留id 以下是Oracel查询时根据部分字段去重复,例如,查询的字段包括id,Sys,C ...

  8. 为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式

    为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式,代码如下: public class DataComparer<T>:IEqualityCompare ...

  9. postgre去重复记录

    postgre去重复记录,主要用到row定位的一个系统表示 “ctid”,能查出纯净的不重复的记录,那要删掉重复值也就容易了,自己去折腾吧. 我所涉及的是得到不重复的记录,就一句话: select c ...

随机推荐

  1. 翻译 - ASP.NET Core 基本知识 - 通用主机 (Generic Host)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0 ...

  2. HTTP协议相关知识整理:

    http协议简介 超文本传输协议:是一种用于分布式.协作式和超媒体信息系统的应用层协议. 一次请求一次响应之后断开连接(无状态,短连接) 分析http请求信息格式 http工作原理 以下是 HTTP ...

  3. 精通MySQL之架构篇

    老刘是即将找工作的研究生,自学大数据开发,一路走来,感慨颇深,网上大数据的资料良莠不齐,于是想写一份详细的大数据开发指南.这份指南把大数据的[基础知识][框架分析][源码理解]都用自己的话描述出来,让 ...

  4. IE双击打不开解决办法

    方法1 [百度电脑专家]一键修复 建议下载并安装[百度电脑专家],官网:http://zhuanjia.baidu.com .打开[百度电脑专家],在搜索框内输入"IE修复",在搜 ...

  5. Redis连接池的相关问题分析与总结

    https://mp.weixin.qq.com/s/juvr89lAvM0uuDmyWyvqNA 阿里干货课堂丨Redis连接池的相关问题分析与总结 原创 技术僧 Java进阶与云计算开发 2018 ...

  6. Advanced Go Concurrency Patterns

    https://talks.golang.org/2013/advconc.slide#5 It's easy to go, but how to stop? Long-lived programs ...

  7. 分布式跟踪的一个流行标准是OpenTracing API,该标准的一个流行实现是Jaeger项目。

    https://github.com/jaegertracing/jaeger https://mp.weixin.qq.com/s/-Tn2AgyHoq8pwMun8JHcGQ Jaeger的深入分 ...

  8. 简单makefile

    https://www.cnblogs.com/prettyshuang/p/5552328.html#_label0

  9. 收集整理Idea常用配置及插件

    收集整理Idea常用配置及插件 一.IDEA配置 1.1 代码智能提示,忽略大小写 二.IDEA插件 2.1 Background Image Plus 2.2 Codota-代码智能提示 2.3 S ...

  10. GeoMesa命令行,索引概述

    GeoMesa 一.GeoMesa命令行 查看classpath 创建表 描述表 批量导入数据 解释查询 统计分析 导出feature 删除feature 获取目录中的全部表的名称 删除表 删除目录 ...