HDU - 1257 最少拦截系统(dp或贪心)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 1257 最少拦截系统(dp或贪心)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257

题意:中文题

题解:

1.dp:题目问最少有几个最长递减子序列,反过来想就是求这个序列中的最长递增子序列的长度为多少。

其实就是变化点造成出现新的序列,然后把变化点放在一起就是最长递增序列啦。

然后就是一道简单的LIS了。

技术分享
 1 //hdu1257
 2 //状态转移方程: dp[i]=max(dp[i],dp[j]+1);
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int h[1111],dp[1111];
 8 
 9 int main(){
10     int n;
11     while(cin>>n){
12         int ans=0;
13         for(int i=1;i<=n;i++) cin>>h[i];
14         for(int i=1;i<=n;i++){
15             dp[i]=1;
16             for(int j=1;j<i;j++){
17                 if(h[j]<h[i]) dp[i]=max(dp[i],dp[j]+1);
18             }
19             ans=max(ans,dp[i]);
20         }
21         cout<<ans<<endl;
22     }
23     return 0;
24 }
View Code

2.贪心:再开一个数组把其中每个位置都开到最大,当成一个个系统,然后就是比较把低值放进去,因为题目特性(要求都是从大到小的顺序)所以如果能够

那个系统能够继续放的话就直接放,否则就再开个系统放,就是这样喵。

技术分享
 1 //hdu1257 
 2 //贪心
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int N=1111;
 8 const int INF=0x3f3f3f3f;
 9 int h[N],F[N];
10 
11 int main(){
12     int n;
13     while(cin>>n){
14         int ans=0;
15         for(int i=1;i<=n;i++) cin>>h[i],F[i]=INF;
16         for(int i=1;i<=n;i++){
17             for(int j=1;j<=i;j++){
18                 if(F[j]>=h[i]){
19                     F[j]=h[i];
20                     break;
21                 }
22             }
23         }
24         for(int i=1;i<=n;i++)
25         if(F[i]!=INF) ans++;
26         cout<<ans<<endl;
27     }
28     return 0;
29 }
View Code

 

以上是关于HDU - 1257 最少拦截系统(dp或贪心)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1257 最少拦截系统

HDU-1257 最少拦截系统 ( 贪心 )

HDU - 1257 最少拦截系统(贪心) 解题

HDU 1257 最少拦截系统(贪心)

hdu1257最少拦截系统 贪心

HDU 1257 最少拦截系统(贪心 or LIS)