HDU 1257 最少攔截系統(貪心 or LIS)
阿新 • • 發佈:2018-05-22
分析 class mode arch urn namespace 最少攔截系統 雷達 mission
怎麽辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裏來求救了,請幫助計算一下最少需要多少套攔截系統.
Input
輸入若幹組數據.每組數據包括:導彈總個數(正整數),導彈依此飛來的高度(雷達給出的高度數據是不大於30000的正整數,用空格分隔)
題目鏈接:
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
怎麽辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裏來求救了,請幫助計算一下最少需要多少套攔截系統.
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> usingnamespace 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)