题意
给你一个长度为 n 的 a 数组,让你构造一个长度为 n 且数值在
[
1
,
5
]
[1,5]
[1,5]的 b 数组,使得 b 数组满足以下要求:
无解输出-1.
思路
d
p
[
i
]
[
j
]
=
k
dp[i][j] = k
dp[i][j]=k表示第 i 位填 j 的情况是由 i-1 位填 k 的状态转移过来的,k=0表示不可到达。
如果
d
p
[
n
]
[
1
−
>
5
]
dp[n][1->5]
dp[n][1−>5]都为0,证明无解。否则倒推回去记录答案输出即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+5;
int n, a[MAXN], dp[MAXN][5];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= 5; i++) dp[0][i] = 1;
for (int i = 0; i < n-1; i++)
{
for (int j = 1; j <= 5; j++)
{
for (int k = 1; k <= 5; k++)
{
if (!dp[i][k]) continue;
if (a[i] < a[i+1] && k < j) dp[i+1][j] = k;
if (a[i] > a[i+1] && k > j) dp[i+1][j] = k;
if (a[i] == a[i+1] && k != j) dp[i+1][j] = k;
}
}
}
vector<int> ans;
for (int j = 1; j <= 5; j++)
{
if (dp[n-1][j])
{
ans.push_back(j);
for (int i = n-1; i > 0; i--)
{
j = dp[i][j];
ans.push_back(j);
}
break;
}
}
if (ans.size() == 0) printf("-1\n");
else
{
for (int i = ans.size()-1; i >= 0; i--)
printf("%d ", ans[i]);
}
return 0;
}
/*
5
1 1 4 2 2
*/