您的位置:首页 > 运维架构

poj 1157 LITTLE SHOP OF FLOWERS

2012-03-10 00:06 169 查看
题目大意就是每种花有一个编号,有几个花瓶,花瓶也是有编号的,每种花放在不同的花瓶的艺术价值不一样,要你把这些花按某种策略放在这些花瓶里,得到艺术价值总值最大,并且,编号小的花所在的花瓶的编号要比编号大的花所在花瓶的编号小。

参考http://www.cnblogs.com/ybrbupt/archive/2011/08/03/2126021.html

http://www.cnblogs.com/sysuwhj/archive/2011/03/31/2001664.html

http://www.cppblog.com/mythit/archive/2009/06/16/87791.html

动态规划的基础题,列出递推的公式

按花束来划分ans[i][j] 表示前i种花束放进前j个花瓶里获得的最大值,

A[i][j]表示第i种花放在第j个花瓶得到的艺术值

ans[i][j] = max{ans[i-1][j] , ans[i-1][j-1] + A[i][j]}



#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define MAX_N 101

int F, V, A[MAX_N][MAX_N], ans[MAX_N][MAX_N];

int main()
{
    memset(ans, 0, sizeof(ans));
    scanf("%d %d", &F, &V);
    for(int i = 1; i <= F; i++)
    {
        for(int j = 1; j <= V; j++)
        {
            scanf("%d", &A[i][j]);
        }
        ans[i][i] = ans[i-1][i-1] + A[i][i];
    }
    for(int i = 1; i <= F; i++)
    {
        for(int j = i + 1; j <= V; j++)
            ans[i][j] = max(ans[i][j-1], ans[i-1][j-1] + A[i][j]);
    }
    printf("%d\n", ans[F][V]);
    return 0;
}


按花瓶来划分ans[i][j] = max(ans[i][j-1], ans[i-1][j-1] + A[i][j]

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define MAX_N 101
#define INF 10000

int F, V, A[MAX_N][MAX_N], ans[MAX_N][MAX_N];

int main()
{
    
    memset(ans, 0, sizeof(ans));
    scanf("%d %d", &F, &V);
    for(int i = 1; i <= F; i++)
    {
        for(int j = 1; j <= V; j++)
        {
            scanf("%d", &A[i][j]);
        }
    }
    for(int i = 0; i <= F;i++)
    {
        for(int j = 0; j < i; j++)
            ans[i][j] = -INF;
    }
    for(int j = 1; j <= V; j++)
    {
        for(int i = 1; i <= min(j, F); i++)
            ans[i][j] = max(ans[i][j-1], ans[i-1][j-1] + A[i][j]);
    }
    printf("%d\n", ans[F][V]);
       return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: