51nod 1021【区间DP】】的更多相关文章

题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021 经典区间dp,dp[i][j] 表示将从 i 到 j 堆石子合并最小代价,长度为 j-i+1,可看做之前已经合并的 i 到 k 和 k 到 j 两堆石子合并,代价是 i 到 j 的石子数量: #include<iostream> #include<cstring> #include<algorithm> using namesp…
51nod 1021 石子归并 题解:从i到j合并的最小值:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]); 最后dp[1][n]即为所求结果. #include<cstdio> #include<algorithm> #include<cstring> #define CLR(a,b) memset((a),(b),sizeof((a))) using namespace std;…
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522 区间DP,从大往小加: 新加入一种数有3种加法:全加左边,全加右边,一左一右: 然后判断一下加完是否满足那些条件即可: 但判断这个条件还挺复杂,一不小心就写丑了错了... 冗余错误写法: #include<iostream> #include<cstdio> #include<cstring> #include<algorit…
思路: 简单的区间dp,从小区间到大区间,随便写. 还有一种是那啥,n-LCS...具体不说了,赶时间)))= =. #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long LL; const int N=1e3+10; char s[N]; int dp[N][N]; int main() { int n; scanf("…
回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每个字符串都可以通过向中间添加一些字符,使之变为回文字符串. 例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba.方案1只需要添加2个字符,是所有方案中添加字符数量最少的. Input 输入一个字符串Str,Str的长度 <= 1000. Output 输出最少添加多少个字符可以使之变为回文字串. Input示例 abbc Output示例 2 题解 很明显的区间dp \(dp[l][r…
区间dp:顾名思义就是在区间上进行动态规划,通过合并小区间求解一段区间上的最优解. 常见模板: for(int len=1;len<n;len++){//区间长度 for(int be=1;be+len<=n;be++){//起点 int en=be+len;//终点 for(int j=be;j<en;j++){//割点 dp[be][en]=min(dp[be][en],dp[be][j]+dp[j+1][en]+割点代价);(max也可以) } } } http://www.51n…
  区间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…
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021 题意:中文题诶- 思路:区间dp 我们用num[i]存储前i个元素的和,用dp[i][j]存储合并从第i个到第j个元素的代价,那么有动态转移方程式为: dp[i][j]=min(dp[i][j], dp[i][k]+dp[k+1][j]+num[j]-num[i-1]): 还有一个问题:如果我们直接枚举i, j的话有可能我们在计算dp[i][j]时dp…
因为刚刚看了区间dp,所以写一下对区间dp的理解. 例题: 石子归并 51Nod - 1021 看了一篇博客,觉得他说得比较容易理解,所以再次重复一遍: 假如你是上帝,已经知道了1~n堆石子的最优解,那么它肯定是由两个子堆组成的, 同理,两个子堆也分别都有自己的两个子堆,到最底层肯定是1~n堆石子的自身, 那我们回到最初,1~n堆石子肯定有一个分割点, dp[ i ][ j ]代表 i 到 j 堆石子的最优解.dp[ 1 ] [ 5 ]=min{dp[1][1]+dp[2][5]+sum,   …
51 Nod 1021 石子归并 模板题,敲就完事了,注意一下这种状态转移方程有个四边形的优化(时间) #include <cstdio> #include <iostream> #include <cstring> using namespace std; int n; ; int f[maxn][maxn], s[maxn][maxn], a[maxn], sum[maxn]; void solve_sim() { memset(f, 0x3f, sizeof(f)…