poj1179 环形+区间dp】的更多相关文章

因为要用到模,所以左起点设置为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…
题目: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…
中文题..题意略 我们知道每次枚举最后合并哪两个.. 于是枚举中间节点k 我犯的错误是将转移方程写成了,dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]+a[l]*a[k+1]*a[k+2]) 然而我们知道,dp[l][k]的头和尾是(l,k+1),dp[k+1][r]的头和尾是(k+1,r+1) 我居然没分析出这一点..困惑于如果[1,4]分成的一个子区间[2,3],dp[2][3]=dp[2][2]+dp[3][3]+a[2]*a[3]*? 这里看成最后一次…
https://www.luogu.org/problemnew/show/P1880 解题过程:本次的题目把石子围成一个环,与排成一列的版本有些不一样,可以在后面数组后面再接上n个元素,表示连续n个石子表示首尾相接,取最大值和最小值. 比如有4堆 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 第二种情况是创造4和1先合并的条件 第三种情况是创造4和1先合并再合并2的条件 第四种情况是创造4和1合并后的新堆  再与 2和3合并后的新堆 合并的条件 #include<stdio.…
状态: fmax[i,j]//表示前i个数分成j个部分的最大值 fmin[i,j]//表示前i个数分成j个部分的最小值 边界:fmax[i,1]:=(sum[i] mod 10+10) mod 10(sum[i]为前i个数的总和);fmin[i,1]:=(sum[i] mod 10+10) mod 10; 状态转移方程: fmax[i,j]:=max(fmax[i,j],fmax[k,j-1]*ff(sum[i]-sum[k])); fmin[i,j]:=min(fmin[i,j],fmin[k…
题目大意: 多边形游戏,有N个顶点的多边形,3 <= N <= 50 ,多边形有N条边,每个顶点中有一个数字(可正可负),每条边上或者是“+”号,或者是“*”号.边从1到N编号,首先选择一条边移去,然后进行如下操作: 1 选择一条边E和边E连接着的两个顶点V1,V2. 2 用一个新的顶点代替边E和V1.V2,新顶点的值为V1.V2中的值进行边上代表的操作得来(相加或相乘) 当最后只剩一个顶点,没有边时,游戏结束.现在的任务是编程求出最后的顶点能获得的最大值,以及输出取该最大值时,第一步需移去的…
区间DP是一类在区间上进行dp的最优问题,一般是根据问题设出一个表示状态的dp,可以是二维的也可以是三维的,一般情况下为二维. 然后将问题划分成两个子问题,也就是一段区间分成左右两个区间,然后将左右两个区间合并到整个区间,或者说局部最优解合并为全局最优解,然后得解. 区间dp就是f[i][j]表示i到j的一段区间, 然后去转移最优值的dp 一段区间表示一段状态,维护i~j的最优值来转移. 常见区间dp有:合并石子,破环成链类题目 其实对于环形区间DP有一个对付环的好方法:关于N取模(特殊处理0)…
  区间DP主要思想是先在小区间取得最优解,然后小区间合并时更新大区间的最优解.       基本代码: //mst(dp,0) 初始化DP数组 ;i<=n;i++) { dp[i][i]=初始值 } ;len<=n;len++) //区间长度 ;i<=n;i++) //枚举起点 { ; //区间终点 if(j>n) break; //越界结束 for(int k=i;k<j;k++) //枚举分割点,构造状态转移方程 { dp[i][j]=max(dp[i][j],dp[i…
vijos1312 链接:www.vijos.org/p/1312 题目分析:经典的环形DP(区间DP) 环形DP,首先解环过程,把数组复制一遍,n个数变成2n个数,从而实现解环 dp[i][j]表示从i开始的长度为j的项链的最大值,由于其长度至少为3,所以就转换为一个经典的区间DP来做 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[j]*a[k]) #include<iostream> #include<cstdio> #inclu…
To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式: 数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数. 输出格式: 输出共2行,第1行为最小得分,第2行为最大得分. 输入输出样例 输入样例#1: 4 4 5 9 4 输出样…