題目描述
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需要的最少的裝箱次數。
輸入輸出樣例
輸入樣例#1:
11 a
b c
a b
c a
b c a b
輸出樣例#1:
3【分析】
f[i][x][y][z]指流水線上剩餘i個產品,手裡有x個a,y個b,z個c時所需要的最少裝箱次數,顯然我們可以以此轉移三種狀態:裝箱a,裝箱b,裝箱c
【**】
//洛谷 p2530 [shoi2001]化工廠裝箱員
#include
#include
#include
#define fo(i,j,k) for(i=j;i<=k;i++)
#define m(a) memset(a,0,sizeof a)
using
namespace
std;
int a[101],f[101][11][11][11],shu[3]; //a:第i組中 物品j的個數
int n;
bool flag[101][11][11][11];
char c;
inline
int dfs(int r,int x,int y,int z)
if(flag[r-k][x][y][z]) return f[r-k][x][y][z];
flag[r-k][x][y][z]=1;
if(r==k)
if(x) f[r-k][x][y][z]=min(f[r-k][x][y][z],dfs(r-k,0,y,z)+1);
if(y) f[r-k][x][y][z]=min(f[r-k][x][y][z],dfs(r-k,x,0,z)+1);
if(z) f[r-k][x][y][z]=min(f[r-k][x][y][z],dfs(r-k,x,y,0)+1);
return f[r-k][x][y][z];
}int main()
memset(f,0x7f,sizeof f);
printf("%d\n",dfs(n,0,0,0));
return
0;}
洛谷 P1434 SHOI2002 滑雪
michael 喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael 想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 1...
洛谷P1434 SHOI2002 滑雪
michael喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 17 ...
洛谷 P1434 SHOI2002 滑雪
題目傳送門 michael 喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael 想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 ...