poj1179】的更多相关文章

//Accepted 244 KB 0 ms //区间dp //石子合并模型 #include <cstdio> #include <cstring> #include <iostream> using namespace std; ; ; ; int dp_min[imax_n][imax_n]; int dp_max[imax_n][imax_n]; int a[imax_n]; ]; int n; int max(int a,int b) { return a&g…
这道题是典型的环形石子归并模型,破环成链后时间复杂度为\(O(n^3)\) 不过,因为题目中所给的数字可能是负数,仅仅记录区间内合并之后的最大值并不满足动态规划的最优子结构性质.因此,还需要额外记录下区间合并后的最小值,由最小值和最大值即可组合出整个区间的最大值. 代码如下: #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace…
因为要用到模,所以左起点设置为0比较好 #include<iostream> #include<cstdio> #include<cstring> #define INF 0x3f3f3f3f using namespace std; ]; ],dp_max[][],dp_min[][]; int cal(char x,int a,int b){if(x=='t')return a+b;return a*b;} int main(){ int n; ){ ;i<n…
Polygon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5293 Accepted: 2238 Description Polygon is a game for one player that starts on a polygon with N vertices, like the one in Figure 1, where N=4. Each vertex is labelled with an integer…
题目:http://poj.org/problem?id=1179 石子合并的升级版.有负值.但运算符只有 + 和 * . 考虑负值对原做法正确性的影响:之所以仅记录最大值可能不对,是因为有可能负数 * 负数得到很大结果. 发现只有这种情况影响.而且这种情况中负数越小越优.所以记录一下最小值,每次参与更新就行了. #include<iostream> #include<cstdio> #include<cstring> using namespace std; //co…
Polygon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:6633   Accepted: 2834 Description Polygon is a game for one player that starts on a polygon with N vertices, like the one in Figure 1, where N=4. Each vertex is labelled with an inte…
题目:http://poj.org/problem?id=1179 区间DP,值得注意的是有负值,而且有乘法,因此可能会影响最大值: 注意memset中写-1仅仅是-1,-2才是一个很小的负数: 最后找mxx时也要注意可能最大是负值,因此不能随便给mxx赋成0或-1之类. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; ],mx[][],mn[][],ans…
http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a polygon with N vertices, like the one in Figure 1, where N=4. Each vertex is labelled with an integer and each edge is labelled with either the symbol + (add…
题目大意: 多边形游戏,有N个顶点的多边形,3 <= N <= 50 ,多边形有N条边,每个顶点中有一个数字(可正可负),每条边上或者是“+”号,或者是“*”号.边从1到N编号,首先选择一条边移去,然后进行如下操作: 1 选择一条边E和边E连接着的两个顶点V1,V2. 2 用一个新的顶点代替边E和V1.V2,新顶点的值为V1.V2中的值进行边上代表的操作得来(相加或相乘) 当最后只剩一个顶点,没有边时,游戏结束.现在的任务是编程求出最后的顶点能获得的最大值,以及输出取该最大值时,第一步需移去的…
常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一头压入元素. 队列中维护的是两个值.一个是位置,这和k的范围有关系,另外一个是f(k)的值,这个用来维护单调性,当然如果f(k)的值可以利用dp值在O(1)的时间内计算出来的话队列中可以只维护一个表示位置的变量. 枚举到一个i的时候,首先判断队首元素的位置是否已经不满足k的范围了,如果不满足就将队首…