51nod 1092【区间dp】】的更多相关文章

思路: 简单的区间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…
51Nod 1092 数据结构暑假作业上出现的一题,学习了一下相关算法之后,找到了oj测试能AC. 1.回文串是一种中心对称的结构,这道题可以转变为求最长回文子序列长度的题目.(子序列:可以不连续) 2.可以得到公式: ans(最少插入字符)= 字符串总长度 - 最长回文子序列长度 3.如何求最长回文子序列的长度呢? wsx dalao的思路是对区间进行维护(我暂时还写不出来),更一般的做法是动态规划(Dynamic Programming). 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…
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522 区间DP,从大往小加: 新加入一种数有3种加法:全加左边,全加右边,一左一右: 然后判断一下加完是否满足那些条件即可: 但判断这个条件还挺复杂,一不小心就写丑了错了... 冗余错误写法: #include<iostream> #include<cstdio> #include<cstring> #include<algorit…
区间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…
Dima the hamster enjoys nibbling different things: cages, sticks, bad problemsetters and even trees! Recently he found a binary search tree and instinctively nibbled all of its edges, hence messing up the vertices. Dima knows that if Andrew, who has…
  区间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,   …