lg3146[简单区间DP] 发表于 2018-05-05 | 分类于 题解 | 阅读数 次 链接:lg3146[简单区间DP] 题解 简单区间DP,dp[i][j]表示i-j所取得的最大的值 dp[i][j]=max(dp[i][j],dp[i][k]+1) 当dp[i][k]==dp[k+1][j]的时候才可以转移 12345678910111213141516171819202122232425262728293031#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<map>#include<algorithm>#define rint register int#define rep(i,x,y) for(rint i=x;i<=y;++i)#define repd(i,x,y) for(rint i=x;i>=y;--i)#define lowbit(x) (x&(-x))#define ll long longusing namespace std;const int N=1e3;int dp[N][N],n,ans;template <typename T>inline void read(T &x){ x=0;char c;int sign=1; do{c=getchar();if(c=='-')sign=-1;}while(c<'0'||c>'9'); do{x=x*10+c-'0'; c=getchar();}while(c>='0'&&c<='9'); x*=sign;}int main(){ read(n); rep(i,1,n){read(dp[i][i]),ans=max(ans,dp[i][i]);} repd(i,n-1,1)rep(j,i+1,n){ rep(k,i,j-1)if(dp[i][k]==dp[k+1][j])dp[i][j]=max(dp[i][j],dp[i][k]+1); ans=max(ans,dp[i][j]); } cout<<ans<<endl; return 0;}