1157 LITTLE SHOP OF FLOWERS【DP插花】

題目大意

您想以最舒適的方式佈置花店的櫥窗。 您有F束鮮花,每束花的種類不同,並且至少連續訂購了許多花瓶。 將花瓶粘在架子上,並從左到右從1到V連續編號,其中V是花瓶的數量,因此花瓶1是最左邊的,花瓶V是最右邊的花瓶。 這些束是可移動的,並且由1到F之間的整數唯一地標識。這些id號具有重要意義:它們確定花瓶行中花束的出現順序,因此,束i必須在花瓶中 每當i <j時,花瓶的左側裝有束j。 例如,假設您有一束杜鵑花(id-number = 1),一束秋海棠(id-number = 2)和一束康乃馨(id-number = 3)。 現在,必須將所有的束放入花瓶中,並保持其編號一致。 杜鵑花束必須在秋海棠左側的花瓶中,而秋海棠束必須在康乃馨左側的花瓶中。 如果花瓶多於束鮮花,多餘的花瓶將被留空。 一個花瓶只能容納一束鮮花。

思路分析

  • 必須將所有的束放入花瓶中,並保持其編號一致。
  • 有負值初始化需注意

雖然是一道簡單題,但是感覺自己對最優子結構的理解得到了提升。設dp[i][j]dp[i][j]爲前i個花用前j個花瓶所能取得的最大值,因此狀態轉移只有兩種可能

  • 前i-1個花用前j-1個花瓶,第i個花用第j個花瓶 dp[i1][j1]+a[i][j]dp[i-1][j-1]+a[i][j]
  • 前i個花用前j-1個花瓶dp[i][j1]dp[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]);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章