1044.花瓶插花 SDNUOJ 1044

Description
有m朵花和n个花瓶,要把这些花全部插入某些花瓶中,花瓶和花都是有序的,花在花瓶中的先后顺序必须与给定顺序相同,每朵花插入每个花瓶能得到的美观程度都不一定相同,选择一些花和花瓶,求插花能得到的最大美观程度。
Input
第一行是两个整数m, n(1 <= m <= n <= 1000),表示花的数量和花瓶的数量。之后m行,每行n个正整数(<= 100),这m行中第i行的第j个数字表示第i朵花插入第j个花瓶的美观程度。
Output
一个整数,最大的总美观程度。
Sample Input
3 5
5 9 3 2 4
1 3 2 9 5
4 2 1 3 5
Sample Output
23
大意:有n种花(编号为1-n),将其插入m(m > n)个花瓶里。插花要按照顺序,即编号较小的花只能插在编号较大的花的左边。

动态规划:dp[i][j]表示前i种花插入前j个花瓶的最大美观程度。
对第i朵花分类:
1、若第i朵花插在第j个花瓶中,则dp[i][j] = dp[i - 1][j - 1] + s[i][j];
2、若第j个花瓶空着,则dp[i][j] = dp[i][j - 1];

综上,状态方程为:dp[i][j] = max(dp[i - 1][j - 1] + s[i][j], dp[i][j - 1]);

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int a[1005][1005];
int v[1005][1005];

int main()
{
    int m, n;
    scanf("%d%d", &m, &n);
    for(int i = 0; i < m; ++i)
        for(int j = 0; j < n; ++j)
            scanf("%d", &a[i][j]);
    for(int i = 0; i < m; ++i)
        for(int j = i; j < n; ++j)/// j 从 i 开始遍历是因为“按顺序”一事
            v[i][j] = max(v[i - 1][j - 1] + a[i][j], v[i][j - 1]);
    cout << v[m - 1][n - 1] << '\n';
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhaobaole2018/article/details/85341507