背景
xq和他的老婆xz最近開了一家花店,他們準備把店裡最好看的花都擺在櫥窗裡。但是他們有很多花瓶,每個花瓶都具有各自的特點,因此,當各個花瓶中放入不同的花束時,會產生不同的美學效果。為了使櫥窗裡的花擺放的最合適,他們得想個辦法安排每種花的擺放位置。
可是因為xq和xz每天都太忙,沒有時間設計櫥窗裡花的擺法,所以他們想讓你幫他們求出花擺放的最大美觀程度和每種花所放的位置。
描述每種花都有乙個標識,假設杜鵑花的標識數為1,秋海棠的標識數為2,康乃馨的標識數為3,所有的花束在放入花瓶時必須保持其標識數的順序,即:杜鵑花必須放在秋海棠左邊的花瓶中,秋海棠必須放在康乃馨左邊的花瓶中。如果花瓶的數目大於花束的數目。則多餘的花瓶必須空置,且每個花瓶中只能放一束花。
每種花放在不同的瓶子裡會產生不同的美觀程度,美觀程度可能是正數也可能是負數。
上述例子中,花瓶與花束的不同搭配所具有的美觀程度,如下表所示:
花 瓶
1 2 3 4 5
1 (杜鵑花) 7 23 -5 -24 16
2 (秋海棠) 5 21 -4 10 23
3 (康乃馨) -21 5 -4 -20 20
根據上表,杜鵑花放在花瓶2中,會顯得非常好看;但若放在花瓶4中則顯得十分難看。
為取得最大美觀程度,你必須在保持花束順序的前提下,使花束的擺放取得最大的美學值,並求出每種花應該擺放的花瓶的編號。
輸入格式
第1行:兩個整數f和v,表示xq和xz一共有f種花,v個花瓶。(1<=f<=v<=100)
第2行到第f+1行:每行有v個數,表示花擺放在不同花瓶裡的美觀程度值value。(美觀程度和不超過maxint,美觀程度有正有負)
輸出格式
輸出有兩行:第一行為輸出最大美觀程度和的值,第二行有f個數表示每朵花應該擺放的花瓶的編號。若有多種方案,輸出字典序較小的(美觀程度不變的情況下,花盡量往前放)
樣例輸入
3 5樣例輸出7 23 -5 -24 16
5 21 -4 10 23
-21 5 -4 -20 20
53題意:2 4 5
有f種花,v個花瓶。每種花放在不同的花瓶得到的beauty值是不同的,給出這個價值矩陣。擺放花的順序不可以改變,即花的序號是遞增的。現在問乙個方案,使得beauty之和是最大的。輸出方案。
思路:原來的思路是 用dp[i][j]表示前j個花瓶擺了i種花,用j作為階段。但是這樣好像不是很好輸出路徑。
應該用dp[i][j]表示第i種花放在第j個花瓶。然後列舉k,表示第i-1種花放在第k個花瓶。
1//#include
2 #include3 #include4 #include5 #include6 #include7 #include8 #include9
10#define inf 0x3f3f3f3f
11using
namespace
std;
12 typedef long
long
ll;13
14int
f, v;
15int val[105][105], dp[105][105], path[105][105], res[105
];16
1718
intmain()
1925}26
27 memset(dp, -inf, sizeof
(dp));
28for(int i = 1; i <= v; i++)
31for(int i = 2; i <= f; i++)38}
39 dp[i][j] +=val[i][j];40}
41}4243
int pos, ans = -inf;
44for(int i = v - f; i <= v; i++)49}
50 printf("
%d\n
", ans);
51 res[f] =pos;
52for(int i = f - 1; i >= 1; i--)
55 printf("
%d", res[1
]);56
for(int i = 2; i <= f; i++)
59 printf("\n"
);60
return0;
61 }
題解 CH5E26 撲克牌
首先不難想到,至少要記錄四個狀態 有4種顏色的牌的面值個數 有3種顏色的牌的面值個數 然後嘗試再記錄乙個狀態 當前狀態動的那個牌的面值的顏色數。但這樣會導致邊界條件特判過於麻煩。考慮進行如下容斥 當動有1種顏色的牌時,顯然 add c1 f c4,c3,c2,c1 1 當動有2種顏色的牌時,顯然 a...
CH5E09 能量相連 區間DP
描述 在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤 吸盤是mars人吸收能量的一種器官 的作用,這兩顆珠子才...