[Acwing] 1010. 拦截导弹
作者:互联网
https://www.acwing.com/problem/content/description/1012/
目录
问题分析
两个问题
- 求最长下降子序列
- 最少用多少个下降子序列 才能填满 区间
思路
第一问 直接变化转移方程即可 或者 reverse一下
第二问 贪心的求子序列即可
从前往后扫描每个数,对于每个数:
- 情况1:如果现有的子序列的结尾都小于当前数, 则创建新子序列
- 情况2: 将当前数放到结尾大于等于它的最小的子序列后面
其他收获
y总的字符串处理:
string line;
getline(cin, line);
stringstream ssin(line);
while (ssin >> h[n]) n ++ ;
CODE:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int f[N],a[N],idx,q[N];
void s_to_int()
{
string s;
getline(cin,s);
s+=' ';
memset(a,0,sizeof a);
int l = 0 ;
int len = s.size();
for(int i = 0; i<len; i++)
{
if(s[i]==' ')
{
++idx;
for(int j = l; j<i; j++)
{
a[idx] += (s[j]-'0');
a[idx]*=10;
}
a[idx]/=10;
l = i+1;
}
}
}
void solve()
{
s_to_int();
//reverse(a+1,a+1+idx);
int ans = 0 ,cnt = 0 ;
for(int i =1; i<=idx; i++)
{
f[i] = 1;
for(int j = 1; j<i; j++)
{
if( a[i]<= a[j])
{
f[i] = max(f[i],f[j]+1);
}
}
ans = max(ans , f[i]);
int k = 0 ;
while(k<cnt && q[k]<a[i]) k++;
if(k == cnt) q[cnt++] = a[i];
else q[k] = a[i];
}
cout<<ans<<endl;
cout<<cnt<<endl;
}
int main()
{
solve();
return 0 ;
}
标签:拦截导弹,idx,10,int,ans,序列,line,1010,Acwing 来源: https://blog.csdn.net/qq_34364611/article/details/118023582