花店橱窗

来源:互联网 发布:android 网络请求封装 编辑:程序博客网 时间:2024/05/16 20:28

Problem 27: 花店橱窗


Time Limit:1 Ms| Memory Limit:64 MB
Difficulty:2

Description

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中则显得十分难看。

为取得最大美观程度,你必须在保持花束顺序的前提下,使花束的摆放取得最大的美学值,并求出每种花应该摆放的花瓶的编号。

Input

第1行:两个整数F和V,表示xq和xz一共有F种花,V个花瓶。(1<=F<=V<=100)
第2行到第F+1行:每行有V个数,表示花摆放在不同花瓶里的美观程度值value。(美观程度和不超过maxint,美观程度有正有负。)

Output

输出有两行:第一行为输出最大美观程度和的值,第二行有F个数表示每朵花应该摆放的花瓶的编号。

Sample Input

3 5 
7 23 -5 -24 16
5 21 -4 10 23
-21 5 -4 -20 20

Sample Output

53
2 4 5
#include <iostream>#include <cstring>#include <cstdio>#define INF 0x3f3f3f3fusing namespace std;int n, m;int val[110][110];int map[110][110];int road[110][110];int main(){    scanf("%d%d", &n, &m);    for (int i = 1; i <= n; i++)    {        for (int j = 1; j <= m; j++)        {            scanf("%d", &map[i][j]);        }    }    for (int i = 1; i <= m; i++)        val[1][i] = map[1][i];    if (n == 1)    {        int wei;        int res = -INF;        for (int i = 1; i <= m; i++)            if (res < val[1][i])            {                wei = i;                res = val[1][i];            }        printf("%d\n%d\n", res, wei);        return 0;    }    for (int i = 2; i <= n; i++)    {        for (int j = i; j <= i + m - n; j++)//第一次错误:j,k值的范围弄错了        {            int mmax = -INF;            for (int k = i - 1; k <= j - 1; k++)//第二次错误:忽略了条件,要尽量往前放,k应该从小到大            {                //val[i][j] = max(val[i][j], val[i - 1][k] + map[i][j]);这是错的                if(mmax < val[i - 1][k] + map[i][j])//第三次错误:val的值一开始是0,有可能所有可能的val都是负的                {                    mmax = val[i - 1][k] + map[i][j];                    road[i][j] = k;                 }            }            val[i][j] = mmax;        }    }    int res = -INF;    int r;    for (int i = n; i <= m; i++)        if (val[n][i] > res)        {            r = i;            res = val[n][i];        }    printf("%d\n", res);     int a[110];    a[n] = r;    for (int i = n - 1; i >= 1; i--)    {        a[i] = road[i + 1][a[i + 1]];     }    for (int i = 1; i <= n - 1; i++)        printf("%d ", a[i]);    printf("%d\n", a[n]);    return 0;}
0 0
原创粉丝点击