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]; }