hdu 4283 - You Are the One


http://acm.hdu.edu.cn/showproblem.php?pid=4283
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
 

有n个男孩,现在要一个一个的登台,每个男孩都有一个diaosi值,如果他是第k个登台的,他的最终的diaosi值就等于他的diaosi值*(k-1),他前边等待了K-1个人,现在要确定一个登台顺序 ,使得所有男孩的diaosi值最小

有一群屌丝,每个屌丝有个屌丝值,如果他第K个上场,屌丝值就为a[i]*(k-1),同过一个小黑屋来调整,是的最后总屌丝值最小。 
(注意:顺序必须在原来顺序的基础上改,要按原来的顺序选择是进小黑屋还是上场,不能简单的从大到小排序,再计算)。

题解:
区间dp,枚举区间长度,在这段区间中,dp[i][j]表示i 在[i,j]中第k个上场的最优解。
dp[i][j] = min ( dp[i][j], dp[i + 1][k + i - 1] + dp[i + k][j] + k * ( sum[j] - sum[i + k - 1] ) + a[i] * ( k - 1 ) )

3、思路分析

设状态dp[i][j]表示i-j区间内i是第k个登台的

 dp[s][e]=min(dp[s][e],dp[s+1][e]+a[s]*(e-s));//s是最后一个选出来的
            dp[s][e]=min(dp[s][e],dp[s+1][e]+Delay(s,e));//第一个被选出来
            for(int k=s+1;k<=e;k++)
            {
                dp[s][e]=min(dp[s][e],dp[s+1][k]+dp[k+1][e]+a[s]*(k-s)+Delay(k,e)*(k-s+1));
                //最后是k-s+1,k后边的人还要等k
            }

dp(l,r)dp(l,r)表示第ll到第rr个人作为前r−l+1r−l+1个人上场的最小不高兴值,答案即为dp(1,n)dp(1,n)
枚举第ll个人的上场次序,如果第ll个人在这r−l+1r−l+1个人中是第i(1≤i≤r−l+1)i(1≤i≤r−l+1)个上场的,由于是通过一个栈调整顺序,且进栈是按编号从小到大的,故第ll个人后面的i−1i−1个人必然在第ll个人上场前已经上场了,那么由第ll个人产生的不高兴值即为(i−1)∗Dl(i−1)∗Dl,第l+1l+1到第l+i−1l+i−1这i−1i−1个人产生的不高兴值为dp(l+1,l+i−1)dp(l+1,l+i−1),剩下的人产生的不高兴值为dp(l+i,r)+i∗∑j=l+irDjdp(l+i,r)+i∗∑j=l+irDj,加上第二部分的值是因为在这些人表演之前又多了ii个人表演


int T,n,a[maxn],sum[maxn],dp[maxn][maxn];
int dfs(int l,int r)
{
    if(l>=r)return 0;
    if(dp[l][r]!=-1)return dp[l][r];
    dp[l][r]=INF;
    for(int i=l;i<=r;i++)
        dp[l][r]=min(dp[l][r],(i-l)*a[l]+dfs(l+1,i)+dfs(i+1,r)+(i-l+1)*(sum[r]-sum[i]));
    return dp[l][r];
}
int main()
{
    int res=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        sum[0]=0;
        for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
        memset(dp,-1,sizeof(dp));
        printf("Case #%d: %d\n",res++,dfs(1,n));
    }
    return 0;
}

思路:区间DP,定义dp[i][j]表示原序列中i到j的人的最小愤怒值的和,设i在区间i到j中第k个上场,那么i+1~i+k-1会先i上台,然后i上台,最后i+k~i+len上台,那么状态转移方程为: dp[i][j]=v[i]*(k-1)+dp[i+1][i+k-1]+(sum[i+len]-sum[i+k-1])*k+dp[i+k][i+len]  sum[]表示前缀和;
將n個男嘉賓重新排序出場(使用一個棧進行維護),第k個出場的人會有a【i】*(k-1)的厭惡值。
先不管使用棧的情況,dp【i】【j】表示從i到j的人出場的最低厭惡值(1~i-1和j+1~n的順序不變);
 
在計算dp【i】【j】時,枚舉k,i<=k<=j,k的意義是第i個人的出場次序(即標號為i的人第k個出場)。
這樣一來在【i,j】區間內,從i+1到k的人要在i之前出場,k+1到j的人要在i之後出場
即轉化成兩個子問題:dp【i+1】【k】和dp【k+1】【j】;
所以dp【i】【j】=min(a[i]*(k-1)+dp[i+1][k]-(sum[k]-sum[i])+dp[k+1][j])
注:因為dp【i+1】【k】整體向前挪了一位所以要減去一倍的和(上式中用前綴和表示,詳見代碼)
最後dp【1】【n】即為答案

发现其实只要调整一下区间Dp时候的策略就好辣。由于要满足出栈的条件,所以只能进行微调。dp[x][y] 表示 区间 [x, y] 上所有的数出栈后的最小花费。那么对于区间 [x, y] 中的数字 a[x],有可能第1个出栈,也有可能最后一个出栈,如果第i个出栈的话前i-1个数字要按照顺序出栈,然后a[x]出栈,[i+1,y]出栈。对于a[x]要加上a[x]*i的花费,对于[i+1, y]要加上sum(i+1, y) * (i-x+2)的额外花费。
14     int T, n;
15     scanf ("%d", &T);
16     for (int t=1; t<=T; t++)
17     {
18         scanf ("%d", &n);
19         a[0] = arr[0] = 0;
20         for (int i=1; i<=n; i++)
21         {
22             scanf ("%I64d", &a[i]);
23             arr[i] = arr[i-1] + a[i];
24         }
25 
26         memset (dp, 0, sizeof(dp));
27         for (int l=1; l<n; l++)
28             for (int i=1; i+l<=n; i++)
29             {
30                 int j = i + l;
31                 LL Min = INF;
32                 for (int k=i; k<=j; k++)
33                 {
34                     LL num = a[i]*(k-i) + (arr[j] - arr[k])*(k-i+1) + dp[i+1][k] + dp[k+1][j];
35                     Min = min (Min, num);
36                 }
37                 dp[i][j] = Min;
38             }
39         printf ("Case #%d: %I64d\n", t, dp[1][n]);
40     }

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts