nyoj 79 & 814

点击打开 79 拦截导弹 链接

//动态规划 
//最长递减(递增)子序列   
#include<stdio.h>
#include<string.h>
#include<iostream>
int mh[20],dp[20];///md放导弹高度, 
using namespace std;
int main()
{
	int n,m,i,j;
	scanf("%d",&n);
	while(n--)
	{
		memset(dp,0,sizeof(dp));
		scanf("%d",&m);		
		for(i=0;i<m;i++)
		scanf("%d",&mh[i]);		
		for(i=1;i<m;i++) 
			for(j=0;j<i;j++)
			{
				if(mh[j]>mh[i])//若是求递增将mh[j]>mh[i]换成mh[j]<mh[i]
				 dp[i]=max(dp[i],dp[j]+1);
			}
		int maxn=0; //比较dp中最大的数 
 		for(i=0;i<m;i++)
		   maxn=max(dp[i],maxn);
		printf("%d\n",maxn+1);
	}
	return 0;
}

点击打开814 又见拦截导弹 链接

//贪心 
#include <stdio.h>
#include <string.h>
int main()
{
	int mh[3005],vt[3005],n;//mh导弹高度,vt遍历 
	while(scanf("%d",&n)!=EOF)
	{
		if(n==-1) break;
		for(int i=0;i<n;i++)
			scanf("%d",&mh[i]);
		memset(vt,0,sizeof(vt));
		int sum=0;
		for(int i=0;i<n;i++)
		{
			if(!vt[i]) //如果未被访问 
			{
				int p=mh[i];
				for(int j=i+1;j<n;j++) //遍历比前一个p小的值 
					if(!vt[j]&&p>=mh[j])
						vt[j]=1,p=mh[j];
				sum++;
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}



不知道咋回事,79题可以动态规划,而814题可以贪心


你可能感兴趣的:(nyoj 79 & 814)