【问题描述】
118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱员grant第1次顺序从流水线上取10个成品(如果一共不足10个,则全部取出),以后每一次把手中某种纯度的成品放进相应的箱子,然后再从流水线上顺序取一些成品,使手中保持10个成品(如果把剩下的全部取出不足10个,则全部取出),如果所有的成品都装进了箱子,那么grant的任务就完成了。
由于装箱是件非常累的事情,grant希望他能够以最少的装箱次数来完成他的任务,现在他请你编个程序帮助他。
【输入格式】
第1行为n(1<=n<=100),为成品的数量
以后n行,每行为一个大写字母A,B或C,表示成品的纯度。
【输出格式】
仅一行,为grant需要的最少的装箱次数。
【输入样例】worker.in
11
A
B
C
A
B
C
A
B
C
A
B
【输出样例】worker.out
3
//动态规划
#include<cstdio>
#include<cstdlib>
int n,i;
int f[150][11][11][11];
bool g[150][11][11][11];
int data[150];
int min(int a,int b)
{
if (a<b) return a; else return b;
}
int dp(int k,int a,int b,int c)
{
int i,j=a+b+c;
for (i=1;i<=10-j;i++)
{
k++;
if (k>n) break;
if (data[k]==1) a++;
if (data[k]==2) b++;
if (data[k]==3) c++;
}
if (k>=n)
{
g[n][a][b][c]=1;
f[n][a][b][c]=(a>0)+(b>0)+(c>0);
return f[n][a][b][c];
}
if (!g[k][a][b][c])
{
g[k][a][b][c]=1;
f[k][a][b][c]=100000;
if (a>0) f[k][a][b][c]=min(f[k][a][b][c],dp(k,0,b,c)+1);
if (b>0) f[k][a][b][c]=min(f[k][a][b][c],dp(k,a,0,c)+1);
if (c>0) f[k][a][b][c]=min(f[k][a][b][c],dp(k,a,b,0)+1);
}
return f[k][a][b][c];
}
int main()
{
freopen("worker.in","r",stdin);
//freopen("worker.out","w",stdout);
scanf("%d\n",&n);
char c;
for (i=1;i<=n;i++)
{
scanf("%c\n",&c);
data[i]=c-64;
}
int ans=dp(0,0,0,0);
printf("%d\n",ans);
//system("pause");
return 0;
}
浙公网安备 33010602011771号