给定一个长度为 nn 的只包含 −1,0,1−1,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"; }
标签:Bytecomputer,ai,POI2013,int,inf,BAJ,P3558 From: https://www.cnblogs.com/towboa/p/17180963.html