给定一个长度为 nn 的只包含 −1,0,11,0,1 的数列 A, 每次操作可以使 ai←ai+ai−1 ,

求最少操作次数使得序列单调不降。

 

 F [i] [3 ]

 分类讨论

 

#include <iostream>
using namespace std ;
 const int N=1e6+2,inf=0x3f3f3f3f;
 int a[N],f[N][3],n;
 
 signed main(){
 	int i;
 	cin>>n; 
 	for(i=1;i<=n;i++) cin>>a[i];
 	f[1][0]=f[1][1]=f[1][2]=inf; f[1][a[1]+1]=0;
 	
 	for(i=2;i<=n;i++){
 		if(a[i]==-1){
 			f[i][0]=f[i-1][0];
 			if(a[i-1]==1) f[i][1]=1+min(f[i-1][0],f[i-1][1]);
 			else f[i][1]=inf;
 			
 			if(a[i-1]==1) f[i][2]=2+min(f[i-1][0],min(f[i-1][1],f[i-1][2]));
			else f[i][2]=2+f[i-1][2];
		 }
		if(a[i]==0){
			f[i][0]=f[i-1][0]+1;
			f[i][1]=min(f[i-1][0],f[i-1][1]);
	if(a[i-1]==1) f[i][2]=1+min(f[i-1][0],min(f[i-1][1],f[i-1][2]));
	else f[i][2]=f[i-1][2]+1;
		}
		if(a[i]==1){
			f[i][0]=f[i-1][0]+2;
			
			if(a[i-1]==-1) f[i][1]=min(f[i-1][0],f[i-1][1])+1;
			else f[i][1]=f[i-1][0]+1;
			
			f[i][2]=min(f[i-1][0],min(f[i-1][1],f[i-1][2]));
		}
	 }
	 if(min(f[n][0],min(f[n][1],f[n][2]))<inf)
	     cout<<min(f[n][0],min(f[n][1],f[n][2]));
	 else cout<<"BRAK";
 }

 

posted on 2023-03-05 17:04  towboat  阅读(19)  评论(0)    收藏  举报