比赛 20111108 评测结果 AAAAAAWWWW
题目名称 机房 最终得分 60
用户昵称 magic 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-08 10:50:51
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
	const int maxlong=100000;
	int d1[2500][2500];
	int d2[2500][2500];
	int f[2500],m,n;
	int data[2500];
int abs(int x);	
int abs(int x)
{
	if (x<0) return -x;else return x;
}
int main()
{
	freopen("orz.in","r",stdin);
	freopen("orz.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&data[i]);
		if (data[i]==1)
		{
			d1[i][i]=1;
		}
		else 
		{
			d2[i][i]=1;
		}
		f[i]=maxlong;
	}
	for (int i=1;i<=n-1;i++)
	{
		for (int j=i+1;j<=n;j++)
		{
			if (data[j]==1)
			{
				d1[i][j]=d1[i][j-1]+1;
			}
			else
			{
				d1[i][j]=d1[i][j-1];
			}
			if (data[j]==2)
			{
				d2[i][j]=d2[i][j-1]+1;
			}
			else 
			{
				d2[i][j]=d2[i][j-1];
			}
		}
	}
	f[1]=1;
	f[0]=0;
	for (int i=2;i<=n;i++)
	{
		for (int j=i-1;j>=1;j--)
		{
			if (abs(d1[j][i]-d2[j][i])<=m)
			{
				if (f[i]>f[j-1]+1)
				{
					f[i]=f[j-1]+1;
				}
			}
			if (d1[j][i]==0||d2[j][i]==0)
			{
				if (f[i]>f[j-1]+1)
				{
					f[i]=f[j-1]+1;
				}
			}
		}
	}
	printf("%d",f[n]);
	return 0;
}