BZOJ_3427_Poi2013 Bytecomputer_DP

Posted fcwww

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ_3427_Poi2013 Bytecomputer_DP相关的知识,希望对你有一定的参考价值。

BZOJ_3427_Poi2013 Bytecomputer_DP

Description

给定一个{-1,0,1}组成的序列,你可以进行x[i]=x[i]+x[i-1]这样的操作,求最少操作次数使其变成不降序列。

 

Sample Input

 

6
-1 1 0 -1 0 1

 

Sample Output

3

 


 

分析:容易知道最后的序列中一定只有-1,0,1

f[i][j]表示当前在第i个人,把这个数变成j的最小花费。

枚举这一位和前一位都是啥,满足能转移的条件即可。

 

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1000050
int a[N],f[N][3],n;
int main() {
	int i;
	scanf("%d",&n);
	memset(f,0x3f,sizeof(f));
	for(i=1;i<=n;++i) scanf("%d",&a[i]);
	f[1][a[1]+1]=0;
	for(i=2;i<=n;++i) {
		if(a[i]==-1) {
			f[i][0]=f[i-1][0];
			//f[i][1]=f[i-1][2]+1;
			f[i][2]=f[i-1][2]+2;
		}else if(a[i]==0) {
			f[i][0]=f[i-1][0]+1;
			f[i][1]=min(f[i-1][1],f[i-1][0]);
			f[i][2]=f[i-1][2]+1;
		}else {
			f[i][0]=f[i-1][0]+2;
			f[i][1]=f[i-1][0]+1;
			f[i][2]=min(min(f[i-1][0],f[i-1][1]),f[i-1][2]);
		}
	}
	int tmp=min(min(f[n][0],f[n][1]),f[n][2]);
	if(tmp>10000000) {
		puts("BRAK");
	}else printf("%d\n",tmp);
}

 

以上是关于BZOJ_3427_Poi2013 Bytecomputer_DP的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ_2212_[Poi2011]Tree Rotations_线段树合并

BZOJ_3872_[Poi2014]Ant colony_dfs

BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案

BZOJ_1132_[POI2008]Tro_计算几何

BZOJ_4378_[POI2015]Logistyka_树状数组

BZOJ_3524_[Poi2014]Couriers_主席树