码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-03 21:04:36      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:targe   比较   题意   最长递增子序列   clu   hid   lap   题解   div   

题目链接: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或贪心)

标签:targe   比较   题意   最长递增子序列   clu   hid   lap   题解   div   

原文地址:http://www.cnblogs.com/Leonard-/p/7470785.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!