1. 程式人生 > >HDU 1257 最少攔截系統(貪心 or LIS)

HDU 1257 最少攔截系統(貪心 or LIS)

分析 class mode arch urn namespace 最少攔截系統 雷達 mission

題目鏈接:

http://acm.hdu.edu.cn/showproblem.php?pid=1257

最少攔截系統

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 53635 Accepted Submission(s): 21019


Problem Description 某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統.但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的導彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈.
怎麽辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裏來求救了,請幫助計算一下最少需要多少套攔截系統.

Input 輸入若幹組數據.每組數據包括:導彈總個數(正整數),導彈依此飛來的高度(雷達給出的高度數據是不大於30000的正整數,用空格分隔)

Output 對應每組數據輸出攔截所有導彈最少要配備多少套這種導彈攔截系統.

Sample Input 8 389 207 155 300 299 170 158 65

Sample Output 2

Source 浙江工業大學第四屆大學生程序設計競賽 分析: 兩種解決方式,貪心和LIS 貪心解法分析: 樣例一: 389 207 155 300 299 170 158 65 解法: 第一套攔截系統:389 207 155 65 第二套攔截系統:300 299 170 158 樣例二: 5 3 6 7 2 10 9 11 8 第一套攔截系統:5 3 2 第二套攔截系統:6 第三套攔截系統:7 第四套攔截系統:10 9 8 第五套攔截系統:11 代碼如下:
#include<bits/stdc++.h>
using
namespace std; int main() { int n; while(~scanf("%d",&n)) { int a[n]; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } int dp[n]; memset(dp,-1,sizeof(dp)); dp[0]=a[0]; int k=0; for(int i=1;i<n;i++) {
if(a[i]>=dp[k]) { dp[++k]=a[i]; }else { for(int j=0;j<=k;j++) { if(dp[j]>a[i]) { dp[j]=a[i]; break; } } } } int s=0; for(int i=0;i<n;i++) { if(dp[i]!=-1) { s++; } } printf("%d\n",s); } return 0; }

二,LIS解法:

一個序列中,最長上升子序列的長度就是不下降子序列的個數。

這句話很重要,理解了這句話題目就ok

看了別人的博客然後理解了。。。。

代碼如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int a[n];
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        int dp[n];
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(int i=1;i<n;i++)
        {
            int t=0;
            for(int j=0;j<i;j++)
            {
                if(a[j]<a[i])
                {
                   if(t<dp[j])
                   {
                       t=dp[j];
                   }
                }
            }
            dp[i]=t+1;
        }
        int t=0;
        for(int i=0;i<n;i++)
        {
            if(t<dp[i])
            {
                t=dp[i];
            }
        }
        printf("%d\n",t);
    }
    return 0;
}

HDU 1257 最少攔截系統(貪心 or LIS)