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 #include #include #include #include #include #include #include #include #include
【顺序】
#include#include #include #include #include #include #include #include #include #include #include
2:给你一串数字,头尾不能动,每次取出一个数字,这个数字贡献=该数字与左右相邻数字的乘积,求一个最小值。
【分析】类似一维的矩阵连乘
#include#include #include #include #include #include #include #include #include #include #include
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<j),第j天和第k天穿的衣服相同,将k+1~j-1衣服套着穿后全部脱掉,那么
dp[i][j]=dp[i][k]+dp[k+1][j-1];
【顺序】
#include#include #include #include #include #include #include #include #include #include #include
【逆序】
#include#include #include #include #include #include #include #include #include #include #include
4:给出n个数,每个数要先进栈然后出栈,第i个出栈的数a,花费的价值是(i-1)*a.问所有的数出栈花费的最小价值。
#include#include #include #include #include #include #include #include #include #include #include