摘要:
就是最长上升子序列,但是要用n^2的算法。#include#include#define REP(i, a, b) for(int i = (a); i a[j]) b1[i] = max(b1[i], b1[j] + 1); } for(int i = n ... 阅读全文
摘要:
这道题一开始我是这么想的最后的答案肯定是某次的马克换回来的,但这个该怎么确定??实际上应该把范围缩小,只看最后一次和倒数第二次之间有什么联系。可以发现,只有两种可能,最后一天换或者不换。换的话就要求出最后一天之前最多的马克,不换的话就是最后一天前最多的美元。设d[i]... 阅读全文
摘要:
这道题的分析方法我很需要学习学习。一开始我想的是f[i][j]表示前i个数子序列长度为j的个数然后发现新加入一个数的时候会和前面的重复,这个时候不知道该怎么处理这种重复。其实我再继续往下想就可以想到,这些重复的序列都有一个特征,结尾都是新加入的这个数那么这就启示我们可... 阅读全文
摘要:
这里要求要走到终点再走回来,可以转化为两个人走。那么我们可以先粗暴的设f[x1][y1][x2][y2]为第一个人走到(x1, y1), 第二个人走到(x2, y2)的最大价值。那么这样空间会很大,通过观察可以发现,一个走的步数=横坐标+纵坐标,因为走一步一定是横坐标... 阅读全文
摘要:
有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。我们可以转化成01背包来做,但是... 阅读全文
摘要:
这个问题就是在原来的基础上加上了可以循环。那么我们可以分两种情况处理,一种是有从尾到头的,例如1表示取,0表示不取,则是11000011一种是没有跨越的, 即000111100那么对于第二种情况可以直接用最大字段和做,关键是第一段要怎么处理。这里需要用到逆向思维,在1... 阅读全文
摘要:
将一堆正整数分为2组,要求2组的和相差最小。显然我们可以把所有可能组合成的数求出来。然后从总和的中间开始往大找,找到了就是其中一个的分组,就可以求出答案了。#include#include#define REP(i, a, b) for(int i = (a); i ... 阅读全文
摘要:
#include#include#define REP(i, a, b) for(int i = (a); i = w; j--) f[j] = max(f[j], f[j - w] + v); } printf("%d\n", f[m]); return 0;... 阅读全文
摘要:
给出一个整数数组a(正负数都有),如何找出一个连续子数组(可以一个都不取,那么结果为0),使得其中的和最大?用f[i]表示以i为结尾的最大字段和,也就是说i一定要取,那么f[i] = max(a[i], f[i-1] + a[i])只有两种选择,之前的一段取或者不取。... 阅读全文
摘要:
一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值。f[i][j] = max(f[i-1][j], f[i][j-1]) + a[i][j];边界: f[i][0] = 0; f[0][i] =... 阅读全文