| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
简单区间DP正常区间DP 答案无误
两端相等 域值加一
转移方程:
for(int l=1;l<p;l++){//l为左右端点的差值
for(int i=1;i+l<=p;i++){
int j=i+l;//i,j为左右端点
if(a[i]==a[j])
dp[i][j]=dp[i+1][j-1]+1;
else
dp[i][j]=dp[i+1][j-1];
for(int k=i;k<j;k++)//k为区间断点
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
但是效率堪忧 TLE 凉凉
仔细读题我们会发现,题目中给了 p一定为偶数 即所有有效区间长度均为偶数
我们可以得到如下优化转移:
for(int l=1;l<p;l+=2){
//l为左右端点的差值,j-i+1为偶数,即j-i为奇数,从1开始,每次加2
for(int i=1;i+l<=p;i++){
int j=i+l;//i,j为左右端点
if(a[i]==a[j])
dp[i][j]=dp[i+1][j-1]+1;
else
dp[i][j]=dp[i+1][j-1];
for(int k=i+1;k<j;k+=2)
//k为区间断点,同上,从dp[i][i+1]开始,每次长度加2
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
2000ms左右,可过
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator