CF1312E 区间DP

读完之后知道应该是区间DP(复杂度很适合,而且模型也像)但是想不出怎么同时处理合并和长度最小的问题。

想了很久还是没什么想法,然后去看了题解,其实就开两个DP数组同步做,同时处理l,r之间合并后的数字以及期间的最小长度就行了。

具体代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int INF=0X3f3f3f3f;
 4 int dp[505][505],num[505][505],a[505],n;
 5 int main(){
 6     memset(dp,INF,sizeof(dp));
 7     scanf("%d",&n);
 8     for (int i=1; i<=n; i++){
 9         scanf("%d",&a[i]);
10         dp[i][i]=1;
11         num[i][i]=a[i];
12     }
13     for (int len=2; len<=n; len++){
14         for (int l=1; l+len-1<=n; l++){
15             int r=l+len-1;
16             for (int k=l; k<r; k++){
17                 if (dp[l][k]==1 && dp[k+1][r]==1 && num[l][k]==num[k+1][r]){
18                     dp[l][r]=1;
19                     num[l][r]=num[l][k]+1;    
20                 }
21                 dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
22             }
23         }
24     }
25     printf("%d",dp[1][n]);
26 }
View Code
原文地址:https://www.cnblogs.com/i-caigou-TT/p/14052758.html