HDU4283(KB22-G)

You Are the One

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3915    Accepted Submission(s): 1809

Problem Description

  The TV shows such as You Are the One has been very popular. In order to meet the need of boys who are still single, TJUT hold the show itself. The show is hold in the Small hall, so it attract a lot of boys and girls. Now there are n boys enrolling in. At the beginning, the n boys stand in a row and go to the stage one by one. However, the director suddenly knows that very boy has a value of diaosi D, if the boy is k-th one go to the stage, the unhappiness of him will be (k-1)*D, because he has to wait for (k-1) people. Luckily, there is a dark room in the Small hall, so the director can put the boy into the dark room temporarily and let the boys behind his go to stage before him. For the dark room is very narrow, the boy who first get into dark room has to leave last. The director wants to change the order of boys by the dark room, so the summary of unhappiness will be least. Can you help him?

Input

  The first line contains a single integer T, the number of test cases.  For each case, the first line is n (0 < n <= 100)
  The next n line are n integer D1-Dn means the value of diaosi of boys (0 <= Di <= 100)

Output

  For each test case, output the least summary of unhappiness .

Sample Input

2
  
5
1
2
3
4
5

5
5
4
3
2
2

Sample Output

Case #1: 20
Case #2: 24

Source

2012 ACM/ICPC Asia Regional Tianjin Online

dp[i][j]表示区间[i,j]的最小总不开心值

把区间[i,j]单独来看,则第i个人可以是第一个出场,也可以是最后一个出场(j-i+1),也可以是在中间出场(1   ~  j-i+1)

不妨设他是第k个出场的(1<=k<=j-i+1),那么根据栈后进先出的特点,以及题目要求原先男的是排好序的,那么::

第  i+1  到 i+k-1  总共有k-1个人要比i先出栈,

第 i+k   到j 总共j-i-k+1个人在i后面出栈

举个例子吧:

有5个人事先排好顺序  1,2,3,4,5

入栈的时候,1入完2入,2入完3入,如果我要第1个人第3个出场,那么入栈出栈顺序是这样的:

1入,2入,3入,3出,2出,1出(到此第一个人就是第3个出场啦,很明显第2,3号人要在1先出,而4,5要在1后出)

这样子, 动态转移方程 就出来了,根据第i个人是第k个出场的,将区间[i,j]分成3个部分

dp[i][j]=min(dp[i][j],dp[i+1,i+k-1]+dp[i+k,j]+(k-1)*a[i]+(sum[j]-sum[i+k-1])*k);

(sum[j]-sum[i+k-1])*k 表示 后面的 j-i-k+1个人是在i后面才出场的,那么每个人的不开心值都会加个 unhappy,sum[i]用来记录前面i个人的总不开心值,根据题目,每个人的unhappy是个 累加的过程 ,多等一个人,就多累加一次

 1 //2017-05-23
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6
 7 using namespace std;
 8
 9 const int N = 110;
10 const int inf = 0x3f3f3f3f;
11 int D[N], dp[N][N], sum[N];
12
13 int main()
14 {
15     int T, n;
16     scanf("%d", &T);
17     for(int kase = 1; kase <= T; kase++){
18         scanf("%d", &n);
19         for(int i = 0; i < n; i++){
20               scanf("%d", &D[i]);
21             if(i == 0)sum[i] = D[i];
22             else sum[i] = sum[i-1] + D[i];
23         }
24         memset(dp, 0, sizeof(dp));
25         for(int i = 0; i < n; i++)
26               for(int j = i+1; j < n; j++)
27                   dp[i][j] = inf;
28         for(int len = 1; len <= n; len++){
29             for(int l = 0; l+len <= n; l++){
30                 int r = l+len-1;
31                 for(int k = 1; k <= len; k++){
32                     dp[l][r] = min(dp[l][r], dp[l+1][l+k-1]+dp[l+k][r]+(k-1)*D[l]+(sum[r]-sum[l+k-1])*k);
33                 }
34             }
35         }
36         printf("Case #%d: %d\n", kase, dp[0][n-1]);
37     }
38
39     return 0;
40 }
时间: 2024-10-14 13:00:53

HDU4283(KB22-G)的相关文章

Codefroces 852 G. Bathroom terminal

G. Bathroom terminal Smith wakes up at the side of a dirty, disused bathroom, his ankle chained to pipes. Next to him is tape-player with a hand-written message "Play Me". He finds a tape in his own back pocket. After putting the tape in the tap

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

张书乐:死活撩不到粉丝G点,内容创业者该咋整?

内容创业的大风口来了,可不是吗!那一年不是内容创业的风口. 1980年代,是朦胧诗.报告文学和武侠:1990年代,言情与少女,新世纪里就更多了,网络文学.网络影视以及各种IP大阵,现在则是自媒体的内容创业. 只是,有时候是来赚钱的,有时候是来赚名的,总的来说,都是来赚存在感的. 文/张书乐(人民网.人民邮电报专栏作家) 新著有<微博运营完全自学手册> 各家平台都准备好了,微信公号里集合了超过千万的运营者:微博再度复活,开始分门别类的做垂直内容:连天涯社区这个老化石,都推出了天涯号,想要拉拢一把

gcc/g++命令

参考:http://www.cnblogs.com/cryinstall/archive/2011/09/27/2280824.html 注意:gcc和g++是linux系统下的编程常用指令,C语言文件用gcc,cpp文件用g++. 1.预处理  g++ -E filename.cpp > filename.i 功能:输出预处理后的文件,linux下以.i为后缀名.只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里 . 这一步主要做了这些事情:宏的替换,还有注释的消除,还有找到相关的

win7,M?i?n?d?m?a?n?a?g?e?r?2?0?1?2使用模板时弹出Runtime error R6025解决方法

Mindjet.MindManager2012.v10.0在应用个别模板时提示"参数错误",然后自动关闭. 解决办法: 如果是win7系统,可以进入C:\Users\(用户名)\AppData\Local\Mindjet\MindManager\10\Library\ENU\Templates, 可以看到如下模板:Management/Meetings and Events/Personal Productivity/Problem Solving/Project Management

CentOS安装g++

本文为个人学习记录. 一.一般操作 Centos支持使用yum安装,安装软件一般格式为yum install....,注意此时是在root权限下. 1 yum install gcc-c++ 二.若出现: 说明此时不是在root权限下,只需输入:su,然后在输入密码以后,重新输入上述命令即可. 最后可以使用一下操作查看是否安装成功 1 which g++ Ref: http://blog.csdn.net/dream_1996/article/details/69397089

2017Summmer_上海金马五校 F题,G题,I题,K题

以下题目均自己搜 F题  A序列 一开始真的没懂题目什么意思,还以为是要连续的子串,结果发现时序列,简直智障,知道题意之后,好久没搞LIS,有点忘了,复习一波以后,直接双向LIS,处理处两个数组L和R,然后对整个数组扫一遍对于每一个下标取m=min(L[i],R[i]);用ans取2*m-1中的最大值.LIS用nlogn的算法实现,二分用的是lower_bound(),直接看代码. //Author: xiaowuga #include <bits/stdc++.h> #define maxx

codeforces gym101243 A C D E F G H J

gym101243 A 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<stack> 9 #include<vector> 10 #include<bit

SVMtrain的参数c和g的优化

SVMtrain的参数c和g的优化 在svm训练过程中,需要对惩罚参数c和核函数的参数g进行优化,选取最好的参数 知道测试集标签的情况下 是让两个参数c和g在某一范围内取离散值,然后,取测试集分类准确率最佳的参数 不知道测试集标签的情况下 (1)利用交叉验证的方法:(k-fold cross validation) Start bestAccuracy = 0  bestc = 0  bestg = 0  //n1 , n2 ,k都是事先给定的值  for c = 2^(-n1) : 2^(n1

gcc 与 g++的区别

原文: http://www.cnblogs.com/wb118115/p/5969775.html ------------------------------------------------------------------------------------ 看的Linux公社的一篇文章,觉得不错,内容复制过来了. 其实在这之前,我一直以为gcc和g++是一个东西,只是有两个不同的名字而已,今天在linux下编译一个c代码时出现了错误才找了一下gcc和g++的区别. 先描述一下今天遇