洛谷P3558 [POI2013]BAJ-Bytecomputer

dp

代码

//这个不是By AcerMo
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1500000];
int dp[1500000][4];//前i个元素,可以得到末尾是j的最少操作数; 
int n;
int main()
{
	memset(dp,0x3f,sizeof dp);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
		dp[1][a[1]+1]=0;
	for(int i=2;i<=n;i++)
	{
		if(a[i]==-1)
		{
			dp[i][0]=dp[i-1][0];//不用操作即可完成 
			//dp[i][1]=min(dp[i][1],dp[i-1][1]+1);//0变到-1 
			dp[i][2]=min(dp[i][2],dp[i-1][2]+2);//1变到-1要进行两步操作; 
		}
		if(a[i]==0)
		{
			dp[i][0]=min(dp[i][0],dp[i-1][0]+1);//-1到0要进行1步 
			dp[i][1]=min(dp[i-1][0],dp[i-1][1]);//0到0不需要 
			dp[i][2]=min(dp[i][2],dp[i-1][2]+1);//1到0,一步; 
		}
		if(a[i]==1)
		{
			dp[i][0]=min(dp[i-1][0]+2,dp[i][0]);//-1到1需要两步 
			dp[i][1]=min(dp[i][1],dp[i-1][0]+1);//0到1需要1步 
			dp[i][2]=min(min(dp[i-1][0],dp[i-1][1]),dp[i-1][2]);//1到1不需要动; 
		}
	}
		
	int ans=0x3f3f3f3f;
	ans=min(min(dp[n][0],dp[n][1]),dp[n][2]); 
	if(ans==0x3f3f3f3f)
		printf("BRAK");
	else 
		printf("%d",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/80899970