1:给出一个括号字符串,问这个字符串中符合规则的最长子串的长度。
【分析】区间DP要覆盖整个区间,那么要求所有情况的并集。
先想出状态方程:
dp[i][j]:i ~ j区间内最大匹配数目
输出:dp[0][n-1](从0开始)
区间DP最先想到的是就是:
1.边界情况初始化
2.for枚举区间长度,一般从第二个开始
3.for枚举起点
4.直接求得终点
5.若括号匹配的情况,相当于外围是ok的,继续深入看内部,左端点右移&右端点左移+2(因为外围匹配,数目+2)
6.一般情况就是枚举断点k,打擂台求匹配数目最大值
7.输出整个区间的最大匹配数
【逆序枚举区间长度】
#include
#include<string>
#include
#include
#include
#include
#include<set>
#include
#include
#include
#include
POJ - 2955 Brackets
【顺序】
#include
#include<string>
#include
#include
#include
#include
#include<set>
#include
#include
#include
#include
括号匹配
2:给你一串数字,头尾不能动,每次取出一个数字,这个数字贡献=该数字与左右相邻数字的乘积,求一个最小值。
【分析】类似一维的矩阵连乘
#include
#include<string>
#include
#include
#include
#include
#include<set>
#include
#include
#include
#include
POJ - 1651 Multiplication Puzzle
3:给你n天需要穿的衣服的样式,每次可以套着穿衣服,脱掉的衣服就不能再穿了,问至少要带多少条衣服才能参加所有宴会.
【分析】
dp[i][j]:i~j区间内所需最少衣服数目
输出:dp[1][n]
之后不再用到:
dp[i][j] = dp[i][j-1]+1;
之后还要用到并且把断点保留到终点:
dp[i][j] = max(dp[i][j], dp[i][k]+dp[k+1][j])
区间dp,dp[i][j]表示i~j天所需的最小数量。
考虑第j天穿不穿,如果穿的话那么 dp[i][j]=dp[i][j-1]+1;
如果不穿的话,那么需要有一个 k (i<=k
dp[i][j]=dp[i][k]+dp[k+1][j-1];
【顺序】
#include
#include<string>
#include
#include
#include
#include
#include<set>
#include
#include
#include
#include
LightOJ - 1422 Halloween Costumes
【逆序】
#include
#include<string>
#include
#include
#include
#include
#include<set>
#include
#include
#include
#include
逆序
4:给出n个数,每个数要先进栈然后出栈,第i个出栈的数a,花费的价值是(i-1)*a.问所有的数出栈花费的最小价值。
#include
#include<string>
#include
#include
#include
#include
#include<set>
#include
#include
#include
#include
You Are the One HDU - 4283