题解 P3146 【[USACO16OPEN]248】

· · 题解

前言

奇妙,最近在学区间动规,怎么区间动规的题目难度都那么高?

阶段、状态的划分

合并区间的长度为阶段,状态是每一个这样长度的区间。

状态的表示

--- ## 本题的特殊性 当$opt[j][k]=opt[k+1][r]$的时候,才可以进行状态转移 --- ## 状态转移方程 $$opt[j][r]=max(opt[j][r],opt[j][k]+1)$$ --- ## 代码 ```cpp #include<iostream> #include<cstdio> using namespace std; #define maxn 257 int n,opt[maxn][maxn],a[maxn],ans; inline void Init() { scanf("%d",&n); for(register int i=1;i<=n;i++) { scanf("%d",&a[i]); opt[i][i]=a[i]; ans=max(a[i],ans); } } inline void Work() { for(register int i=2;i<=n;i++) { for(register int j=1;j+i-1<=n;j++) { int r=i+j-1; for(register int k=j;k<r;k++) { if(opt[j][k]==opt[k+1][r]) opt[j][r]=max(opt[j][r],opt[j][k]+1); ans=max(ans,opt[j][r]); } } } printf("%d\n",ans); } int main() { Init(); Work(); return 0; } ```