首页 > 学院 > 开发设计 > 正文

动态规划:最长上升子序与0-1背包问题

2019-11-06 06:27:27
字体:
来源:转载
供稿:网友

问题描述

一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8). 你的任务,就是对于给定的序列,求出最长上升子序列的长度

代码片

#include <stdio.h> #define MAX 1000 int seq[MAX+10]; int seqlen[MAX+10]; int main() { int i,j,k,N,max,maxlen=1; //maxlen赋值为1 for(i=1;i<=9;i++) seqlen[i]=1; //seqlen数组存以第i个数为终点的最长上升序列 scanf("%d",&N); //输入长度N for(i=1;i<=N;i++) scanf("%d",&seq[i]); //seq数组保存序列数组 for (i=2;i<=N;i++) { max=0; //将max最小化 for (j=1;j<=i-1;j++) { if(seq[j]<seq[i]&&seqlen[j]>max) //在前i-1个序列中,寻找以终点小于seq[i]的最长的子序列,即最优子状态 max=seqlen[j]; } seqlen[i]=max+1; if(seqlen[i]>maxlen) //seqlen中保存的是第i个数为终点的最长上升序列,找出这个数组中最大的值即为最优序列长度 maxlen=seqlen[i]; } PRintf("%d/n",maxlen); return 0; }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表