codeforces 1312E. Contracción de matriz (区间 DP)

Enlace de asunto: https://codeforces.com/problemset/problem/1312/E

Solución: Del significado de la pregunta, se puede ver que si una sección de intervalos se puede fusionar, el último valor es num [i] [j] = k. Si k! = 0 significa que los intervalos [i, j ] se puede fusionar en k, preprocesando num [i] [j], y luego enumerar i para actualizar el valor de dp [i].

#include <bits/stdc++.h>
using namespace std;
const int maxn=550;
int n,a[maxn];
int num[maxn][maxn],dp[maxn];


int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",a+i),num[i][i]=a[i];
	
	for(int l=1;l<=n;l++){
		for(int i=1;i+l<=n;i++){
			int j=i+l;
			for(int k=i;k<j;k++){
				if(num[i][k]==num[k+1][j]&&num[i][k]>0){
					num[i][j]=num[i][k]+1;
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		dp[i]=dp[i-1]+1;
		for(int j=1;j<=i;j++)
			if(num[j][i]>0)
				dp[i]=min(dp[i],dp[j-1]+1);
	}
	printf("%d\n",dp[n]);
	return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/qq_44132777/article/details/104867701
Recomendado
Clasificación