读完之后知道应该是区间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 }