Lib/区間DP
ある区間[l,r)に対する関数が、それが内包する区間の組み合わせで高速に求まる場合、区間を状態に持ってDPが可能(N^2 * 遷移)
典型的には N ~= 500 (3乗)
[l,i)+[i,r) (l<i<r)のmin
[l,r-1)に1要素追加が高速 とか (N^2)
https://usaco.org/index.php?page=viewproblem2&cpid=1114
code:cpp
signed main() {
ll n;
cin >> n;
vector<ll> s(n);
rep(i,n) cin >> si;
vector<vector<ll>> dp(n+1,vector<ll>(n+1,inf));
rep1(range,n+1){
for(ll l=0;l+range<=n;l++){
ll r = l+range;
// print(l,r);
if(range == 1){
dplr = 1;
}else{
for(ll mid=l;mid<=r;mid++){
// print(l,mid,r);
chmin(dplr,dplmid+dpmidr);
}
ll rp = dplr-1+1;
if(sl == sr-1 || sr-2 == sr-1) rp--;
ll lp = dpl+1r+1;
if(sl == sr-1 || sl == sl+1) lp--;
chmin(dplr,min(lp,rp));
}
}
}
cout << dp0n << endl;
}
#Lib