随笔分类 -  动态规划

1 2 下一页

HDOJ 免费馅饼
摘要:简单DP,记忆化会RE,递推即可。# include <cstdio># include <cstring># define N 100005int n, t, f[N][11], a[N][11];int Max(int x, int y){return x>y ? x:y;}/*int dp(int x, int y){ int &ans = f[x][y]; if (ans >= 0) return ans; if (x > t) return ans = 0; ans = 0; ans = Max(ans, dp(x+1, y)); i 阅读全文

posted @ 2012-08-08 15:36 getgoing 阅读(291) 评论(0) 推荐(0)

2004选拔赛 最小值
摘要:给出S和T个整数集合,分别含有n和m个元素(n<=m<=500),问 的最小值。如果a>b && c>d,有|a-c|=|b-d| >= |a-d| + |b-c|(不妨设c>a,然后对d与a,b的大小讨论,可以去掉绝对值符号证明),要对S和T排序。动态规划,if ( i == j) f[i,j] = f[i-1, j-1] + abs( s[i] - t[j] ) ,所以边界条件有 f[0,0] = 0;if (j > i) f[i, j] = min( f[i, j-1], f[i-1, j-1]+abs( s[i] - t[j] 阅读全文

posted @ 2012-07-22 08:32 getgoing 阅读(226) 评论(0) 推荐(0)

DFS专题 Zipper
摘要:这道题放在 DFS 里不太合适,我刚开始就想到了 DP 却没写,DFS 超时后看了题解才发现就是记忆化搜索(白书认为记忆化就是DP);1TLE 2WA,把 lens 写成了 lent 后来才发现的。View Code # include <cstdio># include <cstring># define N 200 + 10bool finished, f[N][N];int lens, lent;char s[N], t[N], g[2 * N];void dfs(int p, int q, int cnt){ if (finished) return; if ( 阅读全文

posted @ 2012-07-18 23:19 getgoing 阅读(323) 评论(0) 推荐(0)

201C Fragile Bridges
摘要:dp,参考了http://www.cppblog.com/hanfei19910905/archive/2012/06/30/180831.html;定义两组状态 L1[i] 表示在 0-i 内的最大得分,L2[i] 表示从 i 出发回到 i 的最大得分,不难得到状态转移方程,最后枚举 i 组合求出最大值;# include <cstdio># include <algorithm># define N 100005using namespace std;typedef long long int LL;int n, num[N];LL L1[N], L2[N], R1 阅读全文

posted @ 2012-07-13 22:03 getgoing 阅读(393) 评论(0) 推荐(0)

[HDOJ] 小兔的棋盘
摘要:链接:http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=13094&pid=1003记忆化搜索,不要要清空 f[][],这道题打表其实更快,因为打表会发现有陷阱;陷阱:n=35 时会达到10^19,当然,用 int 能通过样例;n = 0,输出为 1 ;使用%llu,没有通过(GNU C),不知道什么原因;# include <stdio.h>long long int f[40][40];long long int dp(int i, int j){ if (f[i][j]) return f[i][j]; if 阅读全文

posted @ 2012-06-14 10:43 getgoing 阅读(315) 评论(0) 推荐(0)

UVa 825 - Walking on the Safe Side
摘要:假期放松,做几道小题……这道题的输入比较不同:每行输入的数的个数是不确定的,所以要使用gets和sscanf();开始想偷懒,看了看Stainger大牛的输入也是这样,就没啥可说了,麻烦些就麻烦些;状态转移比较明显,递推可以解决,感觉这道题与其说是dp的,不如说是用来练习输入的;1WA,原因是最后一组输出后不要留空行(留换行);使用了 OIer 常用的写法:把程序每一部分独立起来,确实是方便了调试(在递推时 i 没有初始化,找了很久,最后一块一块注释,发现的)。# include <stdio.h># include <string.h># define N 105in 阅读全文

posted @ 2012-04-30 10:24 getgoing 阅读(508) 评论(0) 推荐(0)

UVa 10404 - Bachet's Game
摘要:乍一看是博弈,也是看了大牛们的思路才会的。。在确定当前状态时,前面所有的状态都确定了,如果能通过移动一步到达核结点,那么当前局势必胜。 1 # include <stdio.h> 2 # include <memory.h> 3 # include <stdlib.h> 4 5 # define INDEX(i) ((i)>>3) 6 # define OFFSET(i) ((i)&0x7) 7 8 # define get_bit(i) ((f[INDEX(i)]>>OFFSET(i)) & 0x1) 9 # def 阅读全文

posted @ 2012-04-13 14:21 getgoing 阅读(338) 评论(0) 推荐(0)

UVa 437 - The Tower of Babylon
摘要:和之前的 Stacking Boxes 很像,但是这里求的是最大高度,并且盒子成了立体状,因此对每个盒子有三种不同的高度,分别为x, y, z,相当于增加两个盒子;记忆化搜索。 1 # include <stdio.h> 2 # include <memory.h> 3 4 typedef struct { 5 int x; 6 int y; 7 int h; 8 }block; 9 10 int n;11 int f[91];12 block b[91];13 14 int cmp(const void *x, const void *y)15 {16 re... 阅读全文

posted @ 2012-04-04 14:59 getgoing 阅读(245) 评论(0) 推荐(0)

UVa 10285 - Longest Run on a Snowboard
摘要:这道题可以定义状态 f[i, j] 为从 (i, j) 出发所能滑的最大长度,则当前点只与四周点的最大长度有关,即得状态转移方程。 1 # include <stdio.h> 2 # include <memory.h> 3 4 # define MAX(x,y) ((x)>(y) ? (x):(y)) 5 6 int r, c; 7 char name[21]; 8 int f[101][101]; 9 int h[101][101];10 11 int dp(int i, int j);12 13 int main()14 {15 int T, i, j, m 阅读全文

posted @ 2012-04-04 12:12 getgoing 阅读(240) 评论(0) 推荐(0)

UVa 10465 - Homer Simpson
摘要:乍一看是道线性规划题,不由想去找数学解法;其实还是个完全背包,只不过只有两件物品,体积就是所耗时间,重量为1;需要注意题目的描述:For each test case, print in a single line the maximum number of burgers Homer can eat without having beer. If homer must have beer, then also print the time he gets for drinking, separated by a single space. It is preferable that Home 阅读全文

posted @ 2012-04-04 11:14 getgoing 阅读(374) 评论(0) 推荐(0)

UVa 531 - Compromise
摘要:LCS问题,不同的是要打印LCS;算法导论上的方法,f 可以使用滚动数组, 应该有更好的打印方法;要注意格式:PE了一次,就是因为最后一个单词后面不能留空格。 1 # include <stdio.h> 2 # include <string.h> 3 4 # define MAX(x, y) ((x)>(y) ? (x):(y)) 5 6 # define UPL 1 7 # define UP 2 8 # define LEFT 3 9 10 int len[2];11 char s1[101][31];12 char s2[101][31];13 int f 阅读全文

posted @ 2012-04-04 10:36 getgoing 阅读(230) 评论(0) 推荐(0)

UVa 10130 - SuperSale
摘要:0-1背包。今天UVa出问题了? 1 # include <stdio.h> 2 # include <memory.h> 3 4 # define MAX(x,y) ((x)>(y) ? (x):(y)) 5 6 int f[31]; 7 int mw[101]; 8 int p[1001]; 9 int w[1001];10 11 int main()12 {13 int k, i, v, T, maxV, N, G;14 15 scanf("%d", &T);16 while (T--)17 {18 scanf("%d& 阅读全文

posted @ 2012-04-04 09:48 getgoing 阅读(225) 评论(0) 推荐(0)

UVa 624 - CD
摘要:这道题没有说明背包的最大容量,估计值取1500min(>=24h)。这道题没有要求字典序,打印一种结果即可;对保存中间结果的方法有点依赖了(浪费空间)。 1 # include <stdio.h> 2 # include <memory.h> 3 4 int v[21]; 5 int f[21][1500]; 6 int p[21][1500]; 7 8 void print_list(int m, int c); 9 10 int main()11 {12 int c, m, i, j;13 14 while (~scanf("%d%d", 阅读全文

posted @ 2012-04-03 11:51 getgoing 阅读(556) 评论(0) 推荐(0)

UVa 348 - Optimal Array Multiplication Sequence
摘要:这道题是矩阵链,本来想照着书写的,L不在,于是自己想了想,试了试,没想到还真写出来了。。看来最难的不是题,而是如何克服畏惧的心(The only thing you have to fear, is fear itself.)。。记忆化搜索,打印那里想来想去不知道怎么把几种情况统一起来,也忘了书上怎么处理的。 1 /* 348 - Optimal Array Multiplication Sequence */ 2 # include <stdio.h> 3 # include <memory.h> 4 5 typedef struct { 6 int r; 7 int 阅读全文

posted @ 2012-04-03 11:11 getgoing 阅读(233) 评论(0) 推荐(0)

UVa 562 - Dividing coins
摘要:用half替代sum>>1后通过了,不明原因。 1 /* 562 - Dividing coins */ 2 # include <stdio.h> 3 # include <memory.h> 4 5 int v[105]; 6 int f[50050/2]; 7 8 int main() 9 {10 int n, m, i, sum, j, half;11 12 scanf("%d", &n);13 while (n--)14 {15 scanf("%d", &m);16 for (sum = 0, 阅读全文

posted @ 2012-04-03 09:53 getgoing 阅读(227) 评论(0) 推荐(0)

c++比c快?一道字符串题目
摘要:题目是这样的:求通过添加字将一个字符串变为回文字符串所需最少的添加次数。解法:求出该字符串与反串的最大公共子序列的长度k,那么字符串的长度n减去k就是所求值。为了不超出内存限制,使用了类似滚动数组的方法。问题在这里,C程序和改写后的C++程序(只改写了头文件,添加了一句using namespace std;),而被判运行时差足有3s,有图为证:可能与测试数据和OJ的评判系统有关,但我想肯定也和这两种语言某种方面的差异有关,在此请教路过的同学,谢谢!附:原题链接:1097 PalindromeC代码 1 # include <stdio.h> 2 # include <str 阅读全文

posted @ 2012-04-02 22:22 getgoing 阅读(578) 评论(0) 推荐(0)

UVa 357 - Let Me Count The Ways
摘要:又是硬币型的。。虽然通过了,还有几个疑问:1. 题目中说 The input will consist of a set of numbers between 0 and 30000 inclusive, one per line in the input file. , 难道不包括30000吗? 输入30000时AC的程序结果是负值(将long long int 改为unsigned long long int可以解决)。2. 使用dev c++输出时出现错误: There are 6 ways to produce 0 cents change. There are 4 ways t... 阅读全文

posted @ 2012-04-02 13:18 getgoing 阅读(367) 评论(0) 推荐(0)

UVa 147 - Dollars
摘要:无数次WA换来一次AC,只因没有使用long long int。。。 1 # include <stdio.h> 2 # include <math.h> 3 4 const int coin[] = {0,5,10,20,50,100,200,500,1000,2000,5000,10000}; 5 6 long long int f[6010][12]; 7 8 long long int dp(int m, int i); 9 10 int main()11 {12 double c;13 14 while (1)15 {16 sca... 阅读全文

posted @ 2012-04-02 11:47 getgoing 阅读(304) 评论(0) 推荐(0)

UVa 10192 - Vacation
摘要:又是lcs,所幸 7min AC了。 1 # include <stdio.h> 2 # include <string.h> 3 4 int len; 5 int x[2]; 6 char s1[105]; 7 char s2[105]; 8 int ans[105*105]; 9 10 int lcs(int *x);11 12 int main()13 {14 int cnt;15 16 cnt = 0;17 while (NULL != gets(s1))18 {19 if (s1[0] == '#') break;20... 阅读全文

posted @ 2012-04-02 10:22 getgoing 阅读(391) 评论(0) 推荐(0)

UVa 10066 - The Twin Towers
摘要:一看就知道是lcs,10分钟敲好了代码,通过示例,一提交MLE,明白了没有保存中间结果;再次提交,打开邮箱,一直F5,等了很长时间没反应,难道又MLE了?结果回到题目页面,发现了下面这句话:You have to select a programming language.。。。再次提交WA:没有把ans[]初始化为-1;最终花了25分钟才AC了,教训啊! 1 # include <stdio.h> 2 # include <memory.h> 3 4 int N1, N2; 5 int x[2]; 6 int s1[101]; 7 int s2[101]; 8 int 阅读全文

posted @ 2012-04-02 10:06 getgoing 阅读(564) 评论(0) 推荐(0)

1 2 下一页

导航