欢迎来到SFWR的博客

P2530 [SHOI2001]化工厂装箱员

题目描述

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需要的最少的装箱次数。

 

————————————————————————————————————

又是一道对下标的利用,也是很像乌龟棋,还要将每次转化为每个,以及注意归零转移

 

#include<bits/stdc++.h>
using namespace std;
int f[110][11][11][11],n;
char ch;
int main()
{
    cin>>n;
    memset(f,63,sizeof(f));
    f[0][0][0][0]=0;
    for(int i=1;i<=n;i++)
    {
        cin>>ch;
        for(int a=0;a<=10;a++)
        for(int b=0;b<=10-a;b++)
        for(int c=0;c<=10-a-b;c++)
        {
            if(a+b+c>10)continue;
            if(ch=='A'&&a)f[i][a][b][c]=f[i-1][a-1][b][c];
            if(ch=='B'&&b)f[i][a][b][c]=f[i-1][a][b-1][c];
            if(ch=='C'&&c)f[i][a][b][c]=f[i-1][a][b][c-1];
                f[i][0][b][c]=min(f[i][0][b][c],f[i][a][b][c]+1);
                f[i][a][0][c]=min(f[i][a][0][c],f[i][a][b][c]+1);
                f[i][a][b][0]=min(f[i][a][b][0],f[i][a][b][c]+1);
        }
    }
    cout<<f[n][0][0][0];
}

 

posted @ 2019-05-22 20:30  SFWR  Views(165)  Comments(0Edit  收藏  举报