状态: d p [ l ] [ r ] → dp[l][r]\to dp[l][r]→该区间内的最少步数
目标: dp[1][n];
边界: dp[i][i] = a[i];
合法判断: d p [ l ] [ k ] = = d p [ k + 1 ] [ r ] dp[l][k] == dp[k+1][r] dp[l][k]==dp[k+1][r] 成立才能转移
转移方程: 区间dp, 枚举未知, 让所有能转移到该未知的状态来转移, 方程见上
attention: 本题的巧妙之处在状态的设计, 当两端点不同的时候能联想到, 分成两段
双倍经验:
@author: jasonleft 区间dp
#include<bits/stdc++.h>#include<bits/extc++.h>#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)#define _rev(i, a, b) for (int i = (a); i >= (b); --i)#define _for(i, a, b) for (int i = (a); i < (b); ++i)#define _rof(i, a, b) for (int i = (a); i > (b); --i)#define ll long long#define db double#define oo 0x3f3f3f3f#define eps 0.00001#define all(x) x.begin(), x.end()#define met(a,