C. Playing Piano(dp保存路径)

其实不管怎么考虑都势必会影响到后面的构造

d p 所以dp的无后效性就来了 ~

, d p [ i ] [ j ] i j 因为前一个数只会影响后一个数,所以dp[i][j]表示枚举到i位置放数字j是否可行

p r e 那么转移的时候记录一个转移前驱pre即可

代码很清晰

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int n;
int dp[maxn][6],ans[maxn],a[maxn],pre[maxn][6];
void run(int x)
{
	ans[n]=x;
	for(int i=n;i>=2;i--)
	{
		ans[i-1]=pre[i][x];
		x=pre[i][x];
	}
	for(int i=1;i<=n;i++)	cout<<ans[i]<<" ";
	exit(0);
}
int main()
{
	cin >> n;
	for(int i=1;i<=n;i++)	cin >> a[i];
	for(int i=1;i<=5;i++)	dp[1][i]=1;
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=5;j++)
		{
			if(dp[i-1][j]==0)	continue;
			if(a[i]==a[i-1])
			{
				for(int s=1;s<=5;s++)
					if(s!=j)	dp[i][s]=1,pre[i][s]=j;
			}
			else if(a[i]>a[i-1])
				for(int s=j+1;s<=5;s++)	dp[i][s]=1,pre[i][s]=j;
			else if(a[i]<a[i-1])
				for(int s=1;s<j;s++)	dp[i][s]=1,pre[i][s]=j;
		}
	}
	for(int i=1;i<=5;i++)
		if(dp[n][i])	run(i);
	cout << -1;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106905744
今日推荐