DP
文章平均质量分 76
fookwood
这个作者很懒,什么都没留下…
展开
-
最长上升子序列nlogn算法
<br /> <br /> <br />这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。<br /><br />A.<br /> O(n^2)算法分析如下: <br /><br /> (a[1]...a[n] 存的都是输入的数) <br /> 1、对于a[n]来转载 2010-07-12 10:47:00 · 31631 阅读 · 10 评论 -
ZOJ 1095 Humble Numbers
这道题怎么被归到DP下边了呢?看着不像啊。数学性较强。从题目可以看出,最大的哪个是2000000000,20亿,显然不能一个一个试了。那么就从另外一个角度来看,直接由2,3,5,7来得到我们需要的数,符合要求的Humble Number为n=2i3j5k7l ,i,j,k,l都是非零的,求出Humble Number即求ijkl的组合方式。具体不解释,上代码:#include#include#define TWOBI 2000000000int My(const void原创 2010-07-19 12:05:00 · 635 阅读 · 0 评论 -
ZOJ 1027 Human Gene Functions
<br />看完题后我 想到是最长公共子序列的变形,可就是想不出来状态转移方程,还是做得题少啊。。抓紧练习 。<br /> <br />给出两个核苷酸序列,每个可以插入-号使其长度相等,一一对应,对其进行比较,把每一个字符对按照表格对应的关系,求出数值,然后把所有的数值 加起来得到score,看看那种对应方式得到的score最大。。。。<br /> <br />还是用c++,模仿了别人的程序,。。。。。<br /> <br />#include<iostream>using namespace std;原创 2010-07-18 13:13:00 · 664 阅读 · 1 评论 -
ZOJ 1074/POJ 1050 To the Max (最大子矩阵和)
<br />首先要学会最大子段和的求法,如下<br />int DP(int a[],int n) { int i,f[101];//f[i]表示以i结尾子段最大和 int max = -200000000; for(i = 2 , f[1] = a[1] ; i <= n ; i++ ) { if (f[i - 1] > 0) //当前边那个f的值是正的时候原创 2010-07-17 12:30:00 · 1934 阅读 · 0 评论 -
POJ 1579 Function Run Fun
<br />很显然,题目中已经给出了递归函数,不过子问题较多,需要储存中间状态,因为是三个参数,所以是三维的DP,这样来说就很好理解了.<br /> <br />#include<stdio.h>#include<stdlib.h>int opt[21][21][21];int w(int a,int b,int c){ if( a <= 0 || b <= 0 || c <= 0) return 1; if( a > 20 || b > 20 ||原创 2010-07-14 22:22:00 · 537 阅读 · 2 评论 -
ZOJ 2136 Longest Ordered Subsequence
<br />最长上升子序列,这个不解释,学动态规划第一个程序就是它吧;<br />#include<stdio.h>int main(void){ int n,geshu,i,j,nTmp,s=0; int a[1005]; int flag[1005]; scanf("%d",&n); while(n--) { scanf("%d",&geshu); for( i = 0 ; i < geshu ; i原创 2010-07-13 18:42:00 · 667 阅读 · 0 评论 -
ZOJ 1642 Match for Bonus
<br /> 最长公共子序列的变形,其实思想上都是一样的,LCS是在字符相同时加1,而这个题是加上题目中给出的bonus.<br /> <br /> <br />#include<stdio.h>int Nchar;char a[2005],b[2005];int lena,lenb;char chars[100];int bonus[100];int opt[2005][2005];int nLen1,nLen2;int search(char a) //找原创 2010-07-14 08:59:00 · 957 阅读 · 0 评论 -
POJ 1088 滑雪
<br />一个令人激动的题目,滑雪,DP经典.在地图中找出最长的严格递减序列,用opt[i][j]来标记从(i,j)开始最长的递减序列,求它的时候,要把四个方向上有最长序列的那个找出来,然后加一赋值给opt[i][j].状态转移方程就懒得写了.<br /> <br />我突然发现这个题有点像DFS,练习动态规划以来我对递归的理解又深入了,#include<stdio.h>int opt[102][102];int map[102][102];int dir[4][2] = {-1,0,1,0,原创 2010-07-15 16:06:00 · 364 阅读 · 0 评论 -
ZOJ 1108 FatMouse's Speed
给定N组数据,每组包含老鼠的体重和速度,你需要找出最长的序列S,使其满足重量严格递增,速度严格递减。很显眼用最长**子序列的方法做。但是这个题需要排序,先对重量排,再对重量相同的排速度,麻烦,不过在网上学会了方法。这次我还学会了系统qsort的用法,知道怎样自己比较函数。waka waka!~ 做出这个我兴奋得跳了起来。。。。小有成就感。。。。#include#includestruct mouse{ int weight; int speed;原创 2010-07-13 20:31:00 · 1534 阅读 · 1 评论 -
ZOJ 1986 Bridging Signals
<br /> 我是从分类上看到这个题的,所以说一开始就知道要用DP,而且是求最长上升子序列,如果直接看得是题的话可能我要读很长时间,不过 最后还是看懂 了.本来以为要用刚学的动态规划知识,没想到原来n2的算法会超时,又要接触到一种更好的方法,O(nlogn),我看了很长时间没怎么看懂,不过多少会用了,看看这里,这个需要慢慢消化,明天接着看 ,争取弄清楚:<br /> <br />http://argo.sysu.edu.cn/bbsanc?path=boards/ACMICPC/D.104原创 2010-07-11 22:34:00 · 869 阅读 · 0 评论 -
POJ 1661 Help Jimmy
这算是一个经典的动态规划题了吧,由于是中文题目,所以题目很好理解. 这个题目的关键也就是找出状态转移方程,然后跟据它写出递归函数(当然也可以用迭代),我越来越意识到递归是个很神奇的东西,和分治法联系在一起的时候问题一下子就变得豁然开朗了. 大概思路就是下面的: 0, k=N+1FindMin(x,k) = max{x - aPlatform[k].Lx + FindMin(原创 2010-07-11 18:12:00 · 480 阅读 · 0 评论 -
百练 2945 导弹拦截
<br />这么水,留下代码纪念。<br /> <br />#include<iostream>//真的不像是一个c++程序using namespace std;int main(void){ int a[30],opt[30]; int n,i,j,ntmp,sum=0,max,m; cin >> n; m=n; while(m--) cin >> a[m+1]; opt[1]=1;max=1;原创 2010-07-24 20:44:00 · 999 阅读 · 0 评论