void-man

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

随笔分类 -  动态规划

摘要:给定一个整数n,要找出n能拆分成多少种不同的若干个数的和与乘积的形式。比如: 4=4 12=1*12 4=1+3 12=2*6 4=2+2 12=3*4 4=1+1+2 12=2*2*3 4=1+1+1+1 先看加法形式,可以构造一个母函数F(x)=(1+x+x^2+...+x^n)(1+x^2+x^4+...+x^n)...(1+x^n),将这个母函数展开后,求出每一个x^k前面的系数Ck,就是对应的整数K有多少种拆分的形式。#include <iostream> using namespace std; const int MAXN = 120; int c1[MAXN+1], 阅读全文
posted @ 2011-05-31 23:56 void-man 阅读(1847) 评论(1) 推荐(0)

摘要:此类问题一般常用的有两种算法,时间复杂度分别是O(n^2)和O(nlogn)第一种,普通算法,用一个标记数组标记包括当前数的最长序列的长度,然后往前递归寻找,此类方法这里不多说了文章的dp问题里已经用过多次了下面着重介绍一下一种省时但是不常用的算法,整体思想是DP+二分搜索,用一个b[k]=m 来标记k长度的最长序列下,最小的数是m,比如有一序列 5 3 7 4首先b[1]=5,初始化长度为1的序列就是第一个数,接下来到3的时候,3独立的长度为1的序列小于5,所以b[1]=3,那么b[2]=4 因为长度为2的序列有两个5-7,3-7,3-4,期中序列最大的数最小的就是4了因此,寻找大于当前数的 阅读全文
posted @ 2011-05-08 14:16 void-man 阅读(577) 评论(0) 推荐(1)