cf: Array Shrinking 【dp】

Sujeto al efecto

给定一个长度为n的数组,相邻的两个数字如果相同就可以合并成一个比他们大一的数字,
问:最后可以达到的最短的数组长度为多少

muestra

input
5
4 3 2 2 3
output
2
样例解释:
34位的2合并成 3 --> 4 3 3 3 
2 3号位的合并成4 --> 4 4 3
1 2 号位4合并成5 --> 5 3
答案就是 2

La idea
con una matriz de dos dimensiones, permite ahorrar hasta matriz en posición diagonal

4 0 0 0 0
0 3 0 0 0
0 0 2 0 0
0 0 0 2 0
0 0 0 0 3

La operación puede ser obtenido mediante la combinación de la siguiente matriz

4 0 0 5 0
0 3 0 4 0
0 0 2 3 4
0 0 0 2 0
0 0 0 0 3

El proceso de conversión

Por último, la matriz de costo de conversión analógica, tal como la esquina superior izquierda de la última 3 2 + 1, y el costo es 2 [0] ha hecho +1, 5 porque esta posición no es cero la mayor parte de su anterior, se puede fusionar el representante tres veces, a dejó un 1, por lo que fue hasta una longitud de 1.

código

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 520;
int n, a[N][N], f[N];
int cost[500], dp[500][500];
int main()
{
	scanf("%d", &n);
	memset(dp, -1, sizeof dp);
	for (int i = 0; i < n; i++)
		scanf("%d", &dp[i][i]);

	for(int len = 2; len <= n; len++)
	{
		for(int left = 0; left + len - 1 < n; left++)
		{
			int right = left + len - 1;
			for(int t = left; t < right; t++)
			{
				if(dp[left][t] == dp[t + 1][right] && dp[left][t] != -1)
				dp[left][right] = dp[left][t] + 1;
			}
		}
	}

	cost[0] = 0;
	for(int i = 1; i <= n; i++)
	{
		cost[i] = 0x3f3f3f3f;
		for(int j = 0; j < i; j++)
		{
			if(dp[j][i - 1] != -1)
			{
				cost[i] = min(cost[i], cost[j] + 1);
			}
		}
	}
	printf("%d\n", cost[n]);
}
Publicados 110 artículos originales · ganado elogios 214 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/qq_45432665/article/details/104792985
Recomendado
Clasificación