关键点描述
二维dps数组
三重循环
权重计算中,需要选择两个位置的参数,所以需要二重循环
代码及注释
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>
#include <unordered_map>
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int num;
int figures[N];
// dsp[i][j]:第i个数填写数字j时,最小权值
int dps[N][10];
int abs(int a, int b)
{
return a > b ? a - b : b - a;
}
int main()
{
memset(dps, INF, sizeof dps);
scanf("%d", &num);
for (int i = 1; i <= num; i++)
scanf("%d", &figures[i]);
// 初始化
for (int i = 0; i <= 9; i++)
{
dps[num][i] = abs(i - figures[num]);
}
// 状态转移
// (b_i - b_i+1)^2
// 倒序
for (int i = num - 1; i >= 1; i--)
{
// (b_i - b_i+1)^2
// 涉及了第i与第i+1位,所以需要两重循环的遍历
// 第i位
for (int j = 0; j <= 9; j++)
{
// 第i+1位
for (int k = 0; k <= 9; k++)
{
dps[i][j] = min(dps[i][j], dps[i + 1][k] + abs(j - figures[i]) + (j - k) * (j - k));
}
}
}
// 选出dps[1][~]中的最小值
int res = INF;
for (int i = 0; i <= 9; i++)
res = min(dps[1][i], res);
printf("%d", res);
return NULL;
}