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