- 博客(11)
- 收藏
- 关注
原创 动态规划入门之嵌套矩形
嵌套矩形描述:有n 个矩形,每个矩形可以用a; b 来描述,表示长和宽。矩形X(a; b) 可以嵌套在矩形Y (c; d)中当且仅当a 但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。输入:第一行是一个正整数N(0 个正正数n,表示该组测试数据中含有矩形的个数(n a; b(0 输出:
2013-12-28 19:41:23 650
原创 动态规划入门之完全背包
完全背包问题(UKP, unbounded knapsack problem):每种物品都有无限个可用 最简单思路就是把完全背包拆分成01背包,就是把01背包中状态转移方程dp[i][j]=dp[i-1][j-w[i]]+v[i]相应的做点修改,也就是说01背包只考虑放与不放进去两种情况,而完全背包要考虑 放0、放1、···、放j/w[i] 的情况。 for (i
2013-12-26 14:59:46 1790
原创 动态规划入门之01背包
描述:有N 种物品,第i 种物品的重量为wi,价值为vi,每种物品只有一个。背包能承受的重量为W。将哪些物品装入背包可使这些物品的总重量不超过背包容量,且价值总和最大?输入:第1 行包含一个整数T,表示有T 组测试用例。每组测试用例有3 行,第1 行包含两个整数N;W(N 1000;W 1000) 分别表示物品的种数和背包的容量,第2 行包含N 个整数表示每种物
2013-12-26 13:39:55 466
原创 动态规划入门之最大M子段和
求最大M子段,,又是典型的动态规划例题,做起来的第一感觉就是跟前两道题有点不一样。。 状态变量: dp[m][n]表示要取m段,并且最后一段包括a[n-1] 的最大子段和状态转移方程:dp[i][j] = dp[i][j - 1] + a[j - 1]; //a[j-1] 直接加入到第i段中for(
2013-12-24 17:47:43 766
原创 动态规划入门之LCS
求最长公共子序列,可以用典型的动态规划解法,上一篇求字符串编辑距离的dp解法也可以说是由这个案例变形而来。 状态变量: dp[i][j]表示字符串a[i]和字符串b[j]的最长公共子序列 状态转移方程:if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max{dp[i-1][j],dp[i][j-1]};
2013-12-24 15:07:12 464
原创 动态规划入门
动态规划思路流程:(1)确定问题的决策对象。(2)对决策过程划分阶段。 (3)对各阶段确定状态变量。(4)根据状态变量确定费用函数和目标函数。(5)建立各阶段状态变量的转移过程,确定状态转移方程。 适用条件:任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效性。1.最优化原理(
2013-12-24 14:48:10 551
原创 求序列第K大数 POJ2104
在POJ2104中,由于会给定序列的区间,而且是多次查询,所以像快速排序加二分这种分治算法的时间效率就不算很高了,然后自己尝试用二叉搜索树保存数据,粗略的写了个java代码: import java.util.Arrays;import java.util.Scanner;/** * * @author Sot_fzh */public class Poj2104
2013-12-05 18:41:59 662
转载 主定理笔记(master theorem)
T(1)=d and for n>1,T(n)=aT(n/b)+cn n is a power of b;prove z if az if a=b, T(n)=O(nlogn); z if a>b, T(n)=O(nlogba)//b为底 logba 为n的次数由问题有 T(1)=d T(n)=aT(n/b)+cn,且有n=b^a 这个递推式描述了大小为
2013-12-03 19:17:27 1204
原创 求序列第K大数的部分快速排序法
用的是经典快速排序方法,每次快排都可以确定一个键的位置,得到关键字的下标,则可判断需要找的第K小的数在其左边还是右边,然后继续快排,直至找到恰好等于关键字为止。。 快速排序的基本思想是:每次从无序的序列中找出一个数作为中间点(可以把第一个数作为中间点),然后把小于中间点的数放在中间点的左边,把大于中间点的数放在中间点的右边;对以上过程重复log(n)次得到有序的序列。平均情况下它的时间
2013-12-03 19:14:27 1344
原创 递推之整数划分问题(2)
整数划分问题的递推式dp( i , j )=dp(i-j,j)+dp(i,j-1); 这里没有限制容器数量,所以与上一题的递推式{dp(i,j)=dp(i-1,j-1)+dp(i,j-i)}有所不同。该递推式的含义由于理解的不同所以因人而已,网上主流的理解方法:dp( i , j )代表一个数值i它可被划分为一个或多个小于等于j的数的方案数,它的递推式更容易理解,就是
2013-12-03 17:23:57 616
原创 递推之整数划分问题(1)
题目大致意思应该是 分配i辆汽车搬运j台电脑的问题,与整数分解类似可以用递推来解决。 关键代码: public int trans(int i,int j){ //i辆车 j台电脑 if(j if(i==1){ return 1; } return trans(i-1,j-1
2013-12-03 16:40:53 727
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人