題目大意
您想以最舒適的方式佈置花店的櫥窗。 您有F束鮮花,每束花的種類不同,並且至少連續訂購了許多花瓶。 將花瓶粘在架子上,並從左到右從1到V連續編號,其中V是花瓶的數量,因此花瓶1是最左邊的,花瓶V是最右邊的花瓶。 這些束是可移動的,並且由1到F之間的整數唯一地標識。這些id號具有重要意義:它們確定花瓶行中花束的出現順序,因此,束i必須在花瓶中 每當i <j時,花瓶的左側裝有束j。 例如,假設您有一束杜鵑花(id-number = 1),一束秋海棠(id-number = 2)和一束康乃馨(id-number = 3)。 現在,必須將所有的束放入花瓶中,並保持其編號一致。 杜鵑花束必須在秋海棠左側的花瓶中,而秋海棠束必須在康乃馨左側的花瓶中。 如果花瓶多於束鮮花,多餘的花瓶將被留空。 一個花瓶只能容納一束鮮花。
思路分析
- 必須將所有的束放入花瓶中,並保持其編號一致。
- 有負值初始化需注意
雖然是一道簡單題,但是感覺自己對最優子結構的理解得到了提升。設爲前i個花用前j個花瓶所能取得的最大值,因此狀態轉移只有兩種可能
- 前i-1個花用前j-1個花瓶,第i個花用第j個花瓶
- 前i個花用前j-1個花瓶
二者取最大值即可,注意有負值因此初始化爲-inf。當然第一行都是0.
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
#define MAX 105
#define inf 1e10
#define ll int
ll a[MAX][MAX], dp[MAX][MAX];
ll F, V, res = 0;
int main() {
scanf("%d%d", &F, &V);
for (int i = 1; i <= F; i++) {
for (int j = 1; j <= V; j++) {
scanf("%d", &a[i][j]); dp[i][j] = -inf;
}
}
dp[1][0] = -inf;
for (int i = 1; i <= F; i++) {
for (int j = i; j <= V; j++) {
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1] + a[i][j]);
}
}
printf("%d", dp[F][V]);
}