0
点赞
收藏
分享

微信扫一扫

拦截导弹(DP)

栖桐 2022-03-16 阅读 60
c++

 问题描述

思路

简单的模板DP

代码

#include<cstdio>

int a[100010]; 
int p[100010]; 
int b[100010]; 

int main () {
	int i = 0, len1 = 0, ans; 
	while (1) {
		scanf ("%d", &a[++i]); 
		if (getchar ()!= ' ') break; 
	}
	int n = i; 
	b[0] = 100000; 
	b[++len1] = a[1];  
	for (i = 2; i<= n; i++) {
		if (a[i]<= b[len1]) {
			b[++len1] = a[i]; 
		}
		else{
			int l = 0, r = len1, mid;  
			while (l<= r) {
				mid = l+ (r-l)/2; 
				if (a[i]<= b[mid]) {
					ans = mid; 
					l = mid+1 ; 
				}
				else r = mid-1; 
			}
			b[ans+1] = a[i]; 
		}
	}
	printf ("%d\n", len1); 
	int sum = 0; 
	int m = 0; 
	while (m<n) {
		int last = 100000000; 
		for (int j = 1; j<= n; j++) {
			if (a[j]>0 && a[j]<= last) {
				m++; 
				last = a[j]; 
				a[j] = -1; 
			}
		}
		sum++; 
	}
	printf ("%d", sum); 
}
#include<stdio.h>
#define N 30000
#define max(a,b) ((a)>(b)?(a):(b))
//DP 最长上升子序列与最长下降子序列 
int main(){
	int a[N],up[N]={0},down[N]={0};
	int i=0,j,k,ans=0,cnt=0;
	while(1){
		scanf("%d",&a[i++]);
		char ch=getchar();
		if(ch=='\n')break;
	}
	for(k=0;k<i;k++){
		up[k]=1;			//up[k]为以a[k]为结尾的最长不下降子序列的长度
		down[k]=1;			//down[k]为以a[k]为结尾的最长下降子序列的长度
		for(j=0;j<k;j++){
			if(a[j]>a[k]){
			//最长下降子序列 
				down[k]=max(down[j]+1,down[k]);
			}
			else{
			//最长不下降子序列 
				up[k]=max(up[j]+1,up[k]);
			}
		}
		ans=max(ans,down[k]);
		cnt=max(cnt,up[k]);
	}
	printf("%d\n%d",ans,cnt);
	return 0;
} 

 ↑ 来自蓝桥杯算法训练 拦截导弹(动态规划 C语言)_hys__handsome的博客-CSDN博客的代码

举报

相关推荐

0 条评论