摘要: http://wikioi.com/problem/1154/这是石子归并的加强版,基本就是分治法的DP。但是有了个环,因为任何一个位置都可开始,所以就建立2*N的数组,然后对可能的区间遍历一次,就是O(n^3)的复杂度。中间错误的地方有:# 把dp(i,j)错误写成F[i][j]# k不能等于i,也不能等于j# 把A[i]*A[k]*A[j]错写成i*k*j#include #include #include #include #define MAX(a, b) a>b?a:b#define LEN 105using namespace std; int A[LEN*2];int F[ 阅读全文
posted @ 2013-10-21 23:34 阿牧遥 阅读(188) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/3027/# 有个小错误调了半天,最终发现sort(line, line+N)错了,后面那个是exclusive的,所以要line+N+1。# 按照右端点从小到大排序。原因是循环结构中是i从1到n, i比较小的时候尽可能选右端点比较小的,这样才可以为后面的线段留下更大的空间。# f[i]表示:算前i条线段时,选上第i条线段,能获得的最大价值。f[i]=max{f[j]}+c[i] (if 不重合)#include #include #include #include #define MAX(a, b) a>b?a:b#define LE 阅读全文
posted @ 2013-10-21 20:55 阿牧遥 阅读(258) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1068/多重背包。边界f[0,0,0,0]=a[1](初始时没有用任何卡片,获得棋盘第一格的分数)DP方程:f[i,j,k,l]=max(f[i-1,j,k,l],f[i,j-1,k,l],f[i,j,k-1,l],f[i,j,k,l-1])+a[i+j*2+k*3+l*4+1 /*此处+1是必须的,因为初始一格没有用卡片*/ ]使用了备忘录+递归。#include #include #define MAX(a, b) a>b?a:busing namespace std;int N;int M;int f[45][45][45][4 阅读全文
posted @ 2013-10-21 12:55 阿牧遥 阅读(245) 评论(0) 推荐(0)