代码改变世界

随笔分类 -  OJ

杭电ACMsteps 3.2.3 Super Jumping! Jumping! Jumping!

2013-11-30 14:53 by 凝月流风, 191 阅读, 收藏,
摘要: 题目要找出一个player从start 位置到 end位置途中所经过的点的权值之和的最大值,并且经过的点必须严格递增; 可以将start作为位置0, end作为位置n+1; 用f[i] 表示到达i位置时所取得的最大和,设集合A = {j 2 #include 3 using namespace std; 4 const int maxn = 1010; 5 int f[maxn]; 6 int main() 7 { 8 int i, j, n, v[maxn]; 9 while (cin>>n && n) {10 for (i = 1; i > v[i];12 阅读全文

ACM steps 3.2.3 Super Jumping! Jumping! Jumping!

2013-11-30 14:34 by 凝月流风, 196 阅读, 收藏,
摘要: 题目要找出一个player从start 位置到 end位置途中所经过的点的权值之和的最大值,并且经过的点必须严格递增; 可以将start作为位置0, end作为位置n+1; 用f[i] 表示到达i位置时所取得的最大和,设集合A = {j 2 #include 3 using namespace std; 4 const int maxn = 1010; 5 int f[maxn]; 6 int main() 7 { 8 int i, j, n, v[maxn]; 9 while (cin>>n && n) {10 for (i = 1; i > v[i];12 阅读全文

杭电ACMsteps 3.2.2 Common Subsequence

2013-11-30 13:54 by 凝月流风, 292 阅读, 收藏,
摘要: 最长公共子序列,动规经典题 f[i][j] = max {f[i-1][j], f[i][j-1], f[i-1][j-1]+(s1[i] == s2[j])} #include #include using namespace std;const int maxn = 1010;int f[maxn][maxn];inline int max(int x, int y, int z) { if (x > y) return x > z ? x : z; else return y > z ? y : z; }int main(){ string s1, s2; int .. 阅读全文

杭电ACMstep 3.2.1

2013-11-30 12:49 by 凝月流风, 218 阅读, 收藏,
摘要: 题目是最大子序列和问题,跟以往的不同是和可以是负数,所以只需要改一下求最大子序列和的代码即可,依然是O(n)的时间复杂度 思路是从左向右不断地找出每一个有可能成为最大和的子序列,用submax保存,每一次将它与Max进行比较更新Max submax的寻找方法是当前面序列a[i] ~a[j] 段的submax为负数时,将前面这段抛弃,另起炉灶,使submax = a[j+1],因为前面的负数部分只会 使submax减小,所以将其抛弃(需要注意的是题目可能有多种情况,找出第一种,所以submax=0时还得保留) 另外编程珠玑上面讲这个问题的几种解决方式讲的很详细,递归虽然要O(n*logn)的复. 阅读全文

codeforce 358D - Dima and Hares 动态规划

2013-11-20 00:02 by 凝月流风, 387 阅读, 收藏,
摘要: 一开始看到题目以为是最大能量项链一样的动规问题,但按照那种划分的话情况非常混乱,而且时间复杂度很大,所以行不通 因为某只hare的joy只有周围两只是否feed相关,所以可把n只hare的最大值分解为前n-1只1)在第n只之后feed的最大值 2)在第n只之前feed的最大值 再加上第n只对应的值。 因为前n-2只与第n只毫无关系,所以可以当做把他们先喂完。 然后再以此往前类推即可。 然后将递归转化为从头开始递推就可以了,,所以只要求出在第k项在第k+1项后feed时前面k项的最大值以及第k项在第k+1项之前feed时的最大值即可。 状态转移方程为 : dp[i][0] = max(dp[i. 阅读全文