zznu 2054 : 油田

题目描述

在太平洋的一片海域,发现了大量的油田!

为了方便开采这些能源,人们将这些油田从1到n进行编号,

人们在开采这些油田时,有三种开采方式,分别为方式A,方式B,方式C。

用不同的方式去开采这些油田所消耗的资金不同,为了防止共振导致的油井坍塌,相邻编号的油田不能使用同一种开采方式。

我们希望你求出开采这n个油田所需要消耗的最小资金,并输出开采每个油田所采用的方式。

输入

先输入一个整数T(0 < T <= 100),代表有T组测试数据。对于每组数据,第一行输入一个正整数n(n<1000)代表油田数目,

接下来n行,每一行包含三个整数。第i(2 <= i <= n+1)行的这三个数代表着开采编号为i-1的油田分别采用A,B,C三种方式开采所消耗的资金。

输出

对于每一组测试样本,先输出样本编号,接下来输出一个整数,代表着开采这n个油田所需要消耗的最小资金,然后按编号从小到大的顺序输出开采每个油田所采用的方式。每一组测试样本的输出占一行。

样例输入

复制
1
2
4 8 3
2 1 4

样例输出

复制
Case 1: 4 CB


dp题, 但是还要保留路径,直接再多开一个数组最后迭代输出路径即可
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 struct node
 6 {
 7     int x, y, z;
 8 }a[1005], b[1005];
 9 int ans[1005], sum, minn, n;
10 void fact(int s)
11 {
12     int m=n;
13     while(m)
14     {
15         if(s==1)
16         {ans[m]= b[m].x;s=b[m].x;}
17         else if(s==2)
18             {ans[m]=b[m].y;s=b[m].y;}
19         else
20             {ans[m]= b[m].z;s=b[m].z;}
21         m--;
22     }
23 }
24 int main()
25 {
26     int t, tt=1;
27     scanf("%d", &t);
28     while(t--)
29     {
30         scanf("%d", &n);
31         memset(a, 0, sizeof(a));
32         for(int i=1; i<=n; i++)
33             scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);
34         for(int i=1; i<n; i++)
35         {
36             a[i+1].x=a[i+1].x+min(a[i].y, a[i].z);
37             if(a[i].y>a[i].z)
38                 b[i].x=3;
39                 else
40                     b[i].x=2;
41             a[i+1].y=a[i+1].y+min(a[i].x, a[i].z);
42             if(a[i].x>a[i].z)
43                 b[i].y=3;
44             else
45                 b[i].y=1;
46             a[i+1].z=a[i+1].z+min(a[i].x, a[i].y);
47             if(a[i].x>a[i].y)
48                 b[i].z=2;
49             else
50                 b[i].z=1;
51         }
52         minn=min(min(a[n].x, a[n].y), a[n].z);
53         printf("Case %d: %d ",tt++, minn);
54         if(minn==a[n].x)
55         {b[n].x=1;fact(1);}
56         else if(minn==a[n].y)
57             {b[n].y=2;fact(2);}
58         else
59             {b[n].z=3;fact(3);}
60         for(int i=1; i<=n; i++)
61             printf("%c", ans[i]+'A'-1);
62         printf("\n");
63     }
64     return 0;
65 }

 




posted @ 2017-12-04 17:27  风子磊  阅读(159)  评论(0编辑  收藏  举报