动态规划之导弹拦截

首先做一下求递增子序列问题

采用动态规划策略设计实现算法,找出由n个数组成的序列的最长单调递增子序列。

联想kmp算法进行字符串匹配时,引入一个辅助数组next数组(突然想到的,日后发觉不对再补,该睡觉了)
我们这里也引入一个辅助数组d数组
状态为当前的最长递增子序列,用d[i]数组记录a数组前i+1个数里可以形成递增序列的下标
d[i]=d[{a数组前i个数里小于a[i]的的d[j]的最大值的下标}]+1
输入输出如下:
在这里插入图片描述
代码为

#include
#define min -100
using namespace std;
int a[100],d[100],b[100];//a数组为输入数组,d数组存放a[i]在递增子序列的序号,b数组为最后形成的递增子序列
void main()
{
	int n,i,j,m,mm;
	cin>>n;	
	for(i=0;i>a[i];
	d[0]=1;
	for(i=1;im)
			{
				m=d[j];
				mm=j;
			}
		if(m==min)//数组a的前i个数都大于a[i],那么在递增子序列的应该是1
			d[i]=1;
		else
			d[i]=d[mm]+1;
	}
	m=min;
	for(i=0;im)//找到递增序列的最大下标即递增子序列的长度
			m=d[i];
	for(i=n-1,j=m;j>=1;i--)
		if(d[i]==j)

你可能感兴趣的:(作业)