标签:九度 题目1112拦截导弹 动态规划
第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。
8 300 207 155 300 299 170 158 65
6
第二次遇到类似的题目了,郁闷的是第一次做的时候AC了,这一次竟然想不起怎么做了,这脑袋。。。
题目分析典型的最长非递增子序列,首先想到动态规划算法;
构造递推关系,用b[i]来表示第i+1个数字,F[i]表示必须包含第i+1个数字的最大子序列长度;
递推关系如下:
F[0] = 1;F[i] = max{F[j]+1,F[i]},其中,0=<j<=i-1,并且b[j]>=b[i]
这样分析后,代码便可得出:
#include <stdio.h>
int main(){
int b[25];
int f[25];
int n;
int max;
while(scanf("%d",&n) != EOF){
max = 0;
for(int i = 0; i < n; i++){
f[i] = 1;
}
for(int i = 0; i < n; i++){
scanf("%d",&b[i]);
}
for(int i = 1; i < n; i++){
for(int j = 0; j < i; j++){
if(b[j] >= b[i]){
if(f[j] + 1 > f[i]){
f[i] = f[j] + 1;
}
}
}
}
for(int i = 0; i < n; i++){
if(f[i] > max){
max = f[i];
}
}
printf("%d\n",max);
}
return 0;
}
标签:九度 题目1112拦截导弹 动态规划
原文地址:http://blog.csdn.net/j754379117/article/details/42833781