zoukankan      html  css  js  c++  java
  • POJ 1836 Alignment

    http://poj.org/problem?id=1836

    题意:给出一排士兵的身高,求出至少需要移除多少个士兵可以使得剩下的士兵往左看或者是往右看可以看到无穷远处。

    思路:士兵的分布最终要呈三角形分布,我们从左边和右边分别求一个最长递增子序列,然后最后只需要一一枚举就可以了。

     1 #include<iostream> 
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 const int maxn = 1000 + 5;
     6 
     7 int dp_L[maxn], dp_R[maxn]; // 分别代表从左、右边开始的LIS长度  
     8 double a[maxn]; // 身高  
     9 
    10 int main()
    11 {
    12     //freopen("D:\txt.txt", "r", stdin);
    13     int n;
    14     while (cin>>n && n)
    15     {
    16         for (int i = 0; i < n; i++)
    17             cin >> a[i];
    18 
    19         dp_L[0] = dp_R[n - 1] = 1;
    20 
    21         for (int i = 1; i<n; i++)
    22         { // 从左边求LIS长度  
    23             dp_L[i] = 1;   //最坏情况是左边的都比他高,那么此时LIS就为1
    24             for (int j = 0; j<i; j++)
    25             if (a[j] < a[i])
    26                 dp_L[i] = max(dp_L[i], dp_L[j] + 1);
    27         }
    28 
    29         for (int i = n - 2; i >= 0; i--)
    30         { 
    31             dp_R[i] = 1;
    32             for (int j = n - 1; j>i; j--)
    33             if (a[j] < a[i])
    34                 dp_R[i] = max(dp_R[i], dp_R[j] + 1);
    35         }
    36         int ans = 0;
    37         //依次枚举情况
    38         for (int i = 0; i < n - 1; i++)
    39         for (int j = i + 1; j < n; j++)
    40             ans = max(ans, dp_L[i] + dp_R[j]);
    41         cout << n - ans << endl;
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    第四阶段学习总结
    第三阶段学习总结
    第二阶段学习总结
    第一阶段内容的学习总结
    第四单元及OO课程总结
    关于工具的碎碎念
    第三单元博客总结
    第二单元博客总结
    第一单元作业总结
    实验五 单元测试
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6359868.html
Copyright © 2011-2022 走看看