SGU 104 解题报告

http://acm.sgu.ru/problem.php?contest=0&problem=104

104. Little shop of flowers

time limit per test: 0.50 sec.
memory limit per test: 4096 KB

You want to arrange the window of your flower shop in a most pleasant way. You have F bunches of flowers, each being of a different kind, and at least as many vases ordered in a row. The vases are glued onto the shelf and are numbered consecutively 1 through V, where V is the number of vases, from left to right so that the vase 1 is the leftmost, and the vase V is the rightmost vase. The bunches are moveable and are uniquely identified by integers between 1 and F. These id-numbers have a significance: They determine the required order of appearance of the flower bunches in the row of vases so that the bunch i must be in a vase to the left of the vase containing bunch j whenever i < j. Suppose, for example, you have bunch of azaleas (id-number=1), a bunch of begonias (id-number=2) and a bunch of carnations (id-number=3). Now, all the bunches must be put into the vases keeping their id-numbers in order. The bunch of azaleas must be in a vase to the left of begonias, and the bunch of begonias must be in a vase to the left of carnations. If there are more vases than bunches of flowers then the excess will be left empty. A vase can hold only one bunch of flowers.

你现在想用最令人满意的方案来装饰你花店的橱窗。你有 F 束花, 每束花种类不同, 种数不超过窗台上的花瓶总数。花瓶被嵌入窗台,并且被顺序从1到 V 编号。V 表示花瓶总数。顺序编号使得1号花瓶在最左边, V 号花瓶在最右边。花束是可以移动的,而且按照不同种类从1 到 F 编号。这些编号是有特殊含义的: 编号小的花必须出现在编号大的花的左边。现在,所有的花必须按编号顺序放在花瓶中,每个花瓶对应一种花。杜鹃花必须在秋海棠左面,秋海棠必须在康乃馨前面。如果花不够,将会有花瓶是空的.

Each vase has a distinct characteristic (just like flowers do). Hence, putting a bunch of flowers in a vase results in a certain aesthetic value, expressed by an integer. The aesthetic values are presented in a table as shown below. Leaving a vase empty has an aesthetic value of 0.

每个花瓶都有自己的特征(就像花一样)。于是,把一种花放入一个花瓶会产生一定的美学价值。用一个整数来表示美学价值,那么空花瓶的美学价值为0,花与花瓶搭配的美学价值如下表:

V A S E S 花瓶

1

2

3

4

5

Bunches 花束

1 (azaleas 杜鹃花)

7

23

-5

-24

16

2 (begonias 秋海棠)

5

21

-4

10

23

3 (carnations 康乃馨)

-21

5

-4

-20

20

According to the table, azaleas, for example, would look great in vase 2, but they would look awful in vase 4.

根据这个表,杜鹃花放在2号花瓶中会好看些,在4号花瓶中现得很别扭。

To achieve the most pleasant effect you have to maximize the sum of aesthetic values for the arrangement while keeping the required ordering of the flowers. If more than one arrangement has the maximal sum value, any one of them will be acceptable. You have to produce exactly one arrangement.

为了让方案最令人满意,你需要使美学价值最大化。如果有多种方案美学价值相同,选取任意一种都算对。你只需要算出一种方案。

ASSUMPTIONS

  • 1 ≤ F ≤ 100 where F is the number of the bunches of flowers. The bunches are numbered 1 through F.
  • FV ≤ 100 where V is the number of vases.
  • -50 Aij 50 where Aij is the aesthetic value obtained by putting the flower bunch i into the vase j.
  • 1 ≤ F ≤ 100 表示花的种数。
  • FV ≤ 100 表示花瓶数。
  • -50 Aij 50 表示i号花束放入j号花瓶产生的美学价值。

Input

  • The first line contains two numbers:F, V.
  • The following F lines: Each of these lines contains V integers,so that Aij is given as thej th number on the (j+1) st line of the input file.
  • 第一行: F, V.
  • 接下来F行每行V个数,其中Aij第(i+1) 行j 列 。

Output

  • The first line will contain the sum of aesthetic values for your arrangement.
  • The second line must present the arrangement as a list of F numbers, so that the k’th number on this line identifies the vase in which the bunch k is put.
  • 第一行包括一个整数表示最大美学价值。
  • 第二行从左到右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

不知道怎么说,后缀法还不是非常熟练,看了别人代码才写出来

CODE

#include<stdio.h>
#include<string.h>
 
int main()
{
  int f,v,i,j,k,D[101][101],a[101][101];
  bool t[101][101];
  scanf("%d%d",&f,&v);
  memset(D,0,sizeof(D));
  memset(t,false,sizeof(t));
  for(i=1;i<=f;++i)
    {
      for(j=1;j<=v;++j)
	scanf("%d",&a[i][j]);
      D[i][i]=D[i-1][i-1]+a[i][i];
      t[i][i]=true;
    }
  for(i=1;i<=f;++i)
    {
      for(j=i+1;j<=v;++j)
	{
	  D[i][j]=D[i][j-1];
	  if(D[i-1][j-1]+a[i][j]>D[i][j])
	    {
	      D[i][j]=D[i-1][j-1]+a[i][j];
	      t[i][j]=true;
	    }
	}
    }
  printf("%dn",D[f][v]);
  for(i=f,k=0,j=v;i>0;--i)
    {
      while(t[i][j]==false) j--;
      a[0][k++]=j--;
    }
  while(k--) printf("%d ",a[0][k]);
  putchar('n');
  return 0;
}
» 本博客采用署名 2.5 中国大陆许可协议进行许可,本文版权归作者所有,欢迎转载,但必须在明显位置给出原文连接。
anyShare分享到:

Leave a Comment

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>