E. Ciel and Gondolas - Codeforces Round #190


https://blog.csdn.net/cqbzwja/article/details/50916994https://codeforces.com/contest/321/problem/E

Fox Ciel is in the Amusement Park. And now she is in a queue in front of the Ferris wheel. There are n people (or foxes more precisely) in the queue: we use first people to refer one at the head of the queue, and n-th people to refer the last one in the queue.
There will be k gondolas, and the way we allocate gondolas looks like this:
  • When the first gondolas come, the q1 people in head of the queue go into the gondolas.
  • Then when the second gondolas come, the q2 people in head of the remain queue go into the gondolas.
        ...
  • The remain qk people go into the last (k-th) gondolas.
Note that q1q2, ..., qk must be positive. You can get from the statement that  and qi > 0.
You know, people don't want to stay with strangers in the gondolas, so your task is to find an optimal allocation way (that is find an optimal sequence q) to make people happy. For every pair of people i and j, there exists a value uij denotes a level of unfamiliar. You can assume uij = uji for all i, j (1 ≤ i, j ≤ n) and uii = 0 for all i (1 ≤ i ≤ n). Then an unfamiliar value of a gondolas is the sum of the levels of unfamiliar between any pair of people that is into the gondolas.
A total unfamiliar value is the sum of unfamiliar values for all gondolas. Help Fox Ciel to find the minimal possible total unfamiliar value for some optimal allocation.
Input
The first line contains two integers n and k (1 ≤ n ≤ 4000 and 1 ≤ k ≤ min(n, 800)) — the number of people in the queue and the number of gondolas. Each of the following n lines contains n integers — matrix u, (0 ≤ uij ≤ 9uij = uji and uii = 0).
Please, use fast input methods (for example, please use BufferedReader instead of Scanner for Java).
Output
Print an integer — the minimal possible total unfamiliar value.
Examples
input
Copy
5 2
0 0 1 1 1
0 0 1 1 1
1 1 0 0 0
1 1 0 0 0
1 1 0 0 0
output
Copy
0
input
Copy
8 3
0 1 1 1 1 1 1 1
1 0 1 1 1 1 1 1
1 1 0 1 1 1 1 1
1 1 1 0 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 0 1 1
1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 0
output
Copy
7
input
Copy
3 2
0 2 0
2 0 3
0 3 0
output
Copy
2
Note
In the first example, we can allocate people like this: {1, 2} goes into a gondolas, {3, 4, 5} goes into another gondolas.
In the second example, an optimal solution is : {1, 2, 3} | {4, 5, 6} | {7, 8}

https://codeforces.com/blog/entry/8192

n(n≤4000)n(n≤4000)个人排队要乘k(k≤min(n,800))k(k≤min(n,800))艘船,每艘船坐的人数不限。第i个人对第j个人有一个不满意度Ui,j(0≤Ui,j≤9且Ui,j=Uj,i=0)Ui,j(0≤Ui,j≤9且Ui,j=Uj,i=0),如果他们在一条船中的话。问,如何安排使得总不满度最小。
DP,满足四边形不等式。
f(i,j)f(i,j)表示前面j个人乘坐i只船的不满度,那么f(i,j)=min(f(i−1,k)+w(k+1,j)|i−1≤k<j)f(i,j)=min(f(i−1,k)+w(k+1,j)|i−1≤k<j),其中w(k+1,j)w(k+1,j)是第k+1个人到第j个人在同一艘船中的不满度,通过O(n2)O(n2)的时间复杂度求出来。

https://blog.csdn.net/jaihk662/article/details/83030345
同一道题目,但是bzoj可能需要读入挂
https://www.codetw.com/epfpxp.html
題意:N個人排成一行,分成K組,要求每組的不和諧值之和最小。
思路:開始以為是斜率優化DP,但是每個區間的值其實已經知道了,即是沒有和下標有關的未知數了,所以沒必要用斜率。 四邊形優化。


dp[i][j]表示前j個人分為i組的最小代價。
然后发现每层当n向右移动的时候,决策点一定向右移动
(可能可以观察+证明)
然后用整体二分trick就可以了。复杂度O(Knlogn)
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + 10, N = 4000 + 5;
const int mod = 1e9+7;
const ll inf = 1e17;

inline int getint() {
    int x = 0; char ch = getchar();
    while(!isdigit(ch)) ch = getchar();
    while(isdigit(ch)) x = (x<<3) + (x<<1) + ch - '0', ch = getchar();
    return x;
}

int n, K, a[N][N], d[N][N];
ll f[805][N], *F, *G;

inline void solve(int l, int r, int al, int ar) {
    if(l > r) return ;
    int mid = l+r>>1; ll mx = inf, t; int pos = 0;
    for (int j=al; j<=ar && j<mid; ++j)  
        if((t = G[j] + d[j+1][mid]) < mx) mx = t, pos = j;
    F[mid] = mx;
    solve(l, mid-1, al, pos);
    solve(mid+1, r, pos, ar);
}
    

int main() {
    n = getint(), K = getint();
    for (int i=1; i<=n; ++i)
        for (int j=1; j<=n; ++j)
            a[i][j] = a[i-1][j] + a[i][j-1] - a[i-1][j-1] + getint();
    for (int i=1; i<=n; ++i) {
        d[i][i] = 0;
        for (int j=i+1; j<=n; ++j) 
            d[i][j] = (a[j][j] - a[j][i-1] - a[i-1][j] + a[i-1][i-1])/2;
    }
    for (int i=1; i<=n; ++i) f[0][i] = inf;
    for (int i=1; i<=K; ++i) {
        F = f[i], G = f[i-1];
        solve(1, n, 0, n);
    }
    cout << f[K][n];

    return 0;
}



X. https://www.cnblogs.com/galaxies/p/cf321E.html
首先有一个O(n2k)的dp。
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + 10, N = 4000 + 5;
const int mod = 1e9+7;
const ll inf = 1e17;

inline int getint() {
    int x = 0; char ch = getchar();
    while(!isdigit(ch)) ch = getchar();
    while(isdigit(ch)) x = (x<<3) + (x<<1) + ch - '0', ch = getchar();
    return x;
}

int n, K, a[N][N], d[N][N];
ll f[805][N];

int main() {
    n = getint(), K = getint();
    for (int i=1; i<=n; ++i)
        for (int j=1; j<=n; ++j)
            a[i][j] = a[i-1][j] + a[i][j-1] - a[i-1][j-1] + getint();
    for (int i=1; i<=n; ++i) {
        d[i][i] = 0;
        for (int j=i+1; j<=n; ++j) 
            d[i][j] = (a[j][j] - a[j][i-1] - a[i-1][j] + a[i-1][i-1])/2;
    }
    for (int i=1; i<=n; ++i) f[0][i] = inf;
    for (int i=1; i<=K; ++i) {
        for (int j=1; j<=n; ++j) {
            f[i][j] = inf;
            for (int k=0; k<j; ++k)
                f[i][j] = min(f[i][j], f[i-1][k] + d[k+1][j]);
        }
    }
    cout << f[K][n];

    return 0;
}

X. https://blog.csdn.net/jaihk662/article/details/83030345
最无脑的暴力DP是O(n²k的),dp[x][y]表示前x个贞鱼上了k辆车的怨气最小值,对于每个状态O(n)转移

→这个就不用多说了,入门DP,复杂度上天



有点经验的话可以看出(猜测)这个DP是有决策单调性的,这样的话就可以nlogn进行整体转移,复杂度O(nklogn)

很遗憾这样还是超时,因为k*n已经接近/超过亿级别,再加个logn肯定不行



想办法消掉k,这有个经典操作:wqs二分(https://www.cnblogs.com/CreeperLKF/p/9045491.html)

一般来讲用来应付一些这样的题目:给了一个选物品的限制条件,要求刚好选k个,让你最大化(最小化)权值(代价),然后其特点就是当选的物品越多的时候权值越大(越小)

一道非常经典的模板题如下:给你一个n个点m条边无向带权连通图,每条边是黑色或白色,让你求一棵最小权的恰好有k条白色边的生成树(bzoj2654)

正解就是二分权值val,让后让所有的白边权值全部加上val,跑一下Kruskal,然后看一下最小生成树中有多少条白色边

如果白色边个数>k,增加val的值继续二分
如果白色边个数<k,减少val的值继续二分
直到最小生成树中刚好有k条白边位置,直接减去val*k就是答案

这道题当然如出一辙:二分val,每多选一辆车就加上额外val点代价,看最后DP完之后选了多少辆车,如果不到k辆就减少val,否则增大val,搞定,时间复杂读O(nlognlogW),其中W为val最大可能

https://blog.csdn.net/Izumi_Hanako/article/details/80275299

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