Sunday, January 13, 2019

[Spoj] LARMY - Lannister Army

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : LARMY - Lannister Army
Source            : Spoj
Category          : Dynamic Programing Optimization
Algorithm         : Divide and Conquer Optimization
Verdict           : Accepted
Note: Using long long int cause TLE. We can use scanf() too.
  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 5000 + 5;  
  6.   
  7. int readInt()  
  8. {  
  9.       bool minus = false;  
  10.       int result = 0;  
  11.     char ch;  
  12.     ch = getchar();  
  13.     while (true)  
  14.     {  
  15.         if (ch == '-'break;  
  16.         if (ch >= '0' && ch <= '9'break;  
  17.         ch = getchar();  
  18.     }  
  19.     if (ch == '-') minus = trueelse result = ch-'0';  
  20.     while (true)  
  21.     {  
  22.         ch = getchar();  
  23.         if (ch < '0' || ch > '9'break;  
  24.         result = result*10 + (ch - '0');  
  25.     }  
  26.     if (minus) return -result;  
  27.     else return result;  
  28. }  
  29.   
  30. int n, k;  
  31. int arr[maxn];  
  32. int cost[maxn][maxn];  
  33. int sum[maxn][maxn];  
  34.   
  35. inline void costCalc()  
  36. {  
  37.       for (int i = 1; i <= n; i++)  
  38.       {  
  39.             cost[i][i] = 0;  
  40.             for (int j = i-1; j >= 1; j--)  
  41.             {  
  42.                   cost[j][i] = cost[j+1][i] + (arr[j] > arr[i]);  
  43.             }  
  44.       }  
  45. }  
  46.   
  47. inline void sumCalc()  
  48. {  
  49.       for (int i = 1; i <= n; i++)  
  50.       {  
  51.             sum[i][i] = 0;  
  52.             for (int j = i+1; j <= n; j++)  
  53.             {  
  54.                   sum[i][j] = sum[i][j-1] + cost[i][j];  
  55.             }  
  56.       }  
  57. }  
  58.   
  59. int dp[maxn][maxn];  
  60. int optimalPos[maxn][maxn];  
  61.   
  62. inline void divideConquer(int Partition, int lft, int rgt, int plft, int prgt)  
  63. {  
  64.       if (lft > rgt) return;  
  65.       int mid = (lft + rgt) >> 1;  
  66.       dp[Partition][mid] = 123456789;  
  67.       optimalPos[Partition][mid] = -1;  
  68.       for (int k = plft; k <= prgt; k++)  
  69.       {  
  70.             int cst = dp[Partition-1][k] + sum[k+1][mid];  
  71.             if (cst < dp[Partition][mid])  
  72.             {  
  73.                   dp[Partition][mid] = cst;  
  74.                   optimalPos[Partition][mid] = k;  
  75.             }  
  76.       }  
  77.       divideConquer(Partition, lft, mid-1, plft, optimalPos[Partition][mid]);  
  78.       divideConquer(Partition, mid+1, rgt, optimalPos[Partition][mid], prgt);  
  79. }  
  80.   
  81. int main()  
  82. {  
  83.       n = readInt();  
  84.       k = readInt();  
  85.       for (int i = 1; i <= n; i++) arr[i] = readInt();  
  86.       costCalc();  
  87.       sumCalc();  
  88.       for (int i = 1; i <= n; i++) // base case  
  89.       {  
  90.             dp[1][i] = sum[1][i];  
  91.       }  
  92.       for (int Partition = 2; Partition <= k; Partition++)  
  93.       {  
  94.             divideConquer(Partition, 1, n, 1, n);  
  95.       }  
  96.       printf("%d\n", dp[k][n]);  
  97. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.