动态规划复习-HDU2084

摘要: 水题一道,但是论坛中有人说从上往下dp,一定是wa,我两个方向都试过了,全部ac。自底向上dp:#include int c, n;int dp[100][100];int max (int a, int b) { if (a > b) return a; return b;}int main() { scanf("%d", &c); while (c--) { scanf("%d", &n)... 阅读全文
posted @ 2012-02-08 23:40 见路非道 阅读(145) 评论(0) 推荐(0)

动态规划复习-HDU1081

摘要: 注意多个测试用例,和poj不一样 注意输出用例结果之间要换行代码如下:#include int rect[101][101];int a[101], dp[101];int n, mx;int main() { while (scanf("%d", &n) != EOF) { for (int i = 1; i dp[k - 1] + a[k]) dp[k] = a[k]; ... 阅读全文
posted @ 2012-02-08 13:51 见路非道 阅读(115) 评论(0) 推荐(0)

动态规划复习-HDU1159

摘要: 最长公共子序列问题,经典dp#include #include #include using namespace std;char a[2000], b[2000];int al, bl, m;int dp[2000][2000];int main() { while (cin >> a >> b) { al = strlen(a); bl = strlen(b); bool one = f... 阅读全文
posted @ 2012-02-07 23:35 见路非道 阅读(173) 评论(0) 推荐(0)

动态规划复习-HDU1231

摘要: 子序列最大和问题,记录开始结束位置。#include int k, m, st, ed;int a[10001], dp[10001], s[10001], e[10001];int main() { while (scanf("%d", &k), k) { for (int i = 1; i a[i]) { dp[i] = dp[i - 1] + a[i]; s[i] = s[i... 阅读全文
posted @ 2012-02-07 22:41 见路非道 阅读(109) 评论(0) 推荐(0)

POJ1050解题报告

摘要: 这是HDU1003题目的扩展,一维扩展到二维。HDU1003解题思路很简单,但是如果要记录起始位置的话,需要额外两个数组。HDU1003中,设dp[i]表示以第i个数结尾的子序列中,和最大的值,状态转移方程为:dp[i] = max(dp[i - 1) + a[i], a[i])刚刚看到POJ1050这个题目,也想着顺着这个思路扩展,但是不得其解,无法构造状态转移方程。后来看了别人的解题报告,才恍... 阅读全文
posted @ 2012-02-07 14:42 见路非道 阅读(214) 评论(0) 推荐(0)

POJ1088解题报告

摘要: 今天是元宵节,外面的鞭炮声很大。元宵晚会已经成了那些人的KTV了。我还是总结一下白天的题目好了。POJ1088是一道在二维数组上的最长下降子序列或者最长上升子序列问题。很自然会用h[i][j]来表示到(i,j)位置的最长上升子序列的长度。考虑状态转移方程,与之有关系的是: h[i - 1][j] h[i][j - 1] h[i + 1][j] h[i][j + 1]状态转移方程如下:h[i][j]... 阅读全文
posted @ 2012-02-06 21:04 见路非道 阅读(184) 评论(0) 推荐(0)

POJ1157解题报告

摘要: 通过这个题目,对自顶向下分析,有了进一步的理解。题意如下表:Vases(j)12345Bunches(i)1723-5-24162521-410233-215-4-20201,2,3行代表三束花,1,2,3,4,5列代表这么多列的花瓶,要把三束花放到花瓶中,满足一下几个条件: 不同的花要出现在不同的列 j1表示1号花放的列,依次。保证j1<j2<j3 最重要的,要保证三个位置上的数字和最大。分析这... 阅读全文
posted @ 2012-02-05 21:13 见路非道 阅读(162) 评论(0) 推荐(0)

POJ1631解题报告

摘要: 这道题目和前面两道是类似的,如果采用相同的方法去解,会出现TLE。前面的方法时间复杂度是O(n^2)的,这道题目,我们要采用的方法是O(nlogn)的。思路想法儿也比较简单,就是在前面方法的基础之上,运用了二分查找。在使用O(n^2)的方法的时候,查找i前边的比它小或者大的时候,是遍历前面每一个元素,并且进行比较。这样,时间复杂度就为O(n^2)。但是,在实现算法的过程中,在计算第i个元素的时候,... 阅读全文
posted @ 2012-02-05 10:27 见路非道 阅读(312) 评论(0) 推荐(0)

POJ2533解题报告

摘要: 水题一道,分析方法见前一篇博客。代码如下:#include using namespace std;int a[1001], dp[1001];int main() { int n; while (cin >> n) { for (int i = 1; i > a[i]; int max = 0; for (int i = 1; i max) max = dp[i]; } cout 阅读全文
posted @ 2012-02-03 15:44 见路非道 阅读(123) 评论(0) 推荐(0)

POJ1887解题报告(最长下降子序列)

摘要: 题目说了很长,要求最长下降子序列。题目的输入比较奇怪,需要全部读入之后,再进行dp,否则会TLE(这是我看其他同学说的)。这个题目的递归表达形式(正规一点儿应该叫做:状态转移方程,我太土了)---状态转移方程为:dp[i] = dp[j] + 1 (0 > tmp; if (-1 == tmp) break; int len = 0; a[len++] = tmp; while(1) { ... 阅读全文
posted @ 2012-02-02 22:22 见路非道 阅读(195) 评论(0) 推荐(0)