动态规划基础——最长非增子序列
题目比较简单,就是在一个数组里面找出最长的非增子序列,要注意,并不要求连续。
如:6,7,2,4,5,3最长的非增子序列是7,5,3而不是5,3.
动态规划的思想就是自底向上,求解问题:
如:f(n) = f(n-1) + f(n-2);
f(1) = a; f(2) = b;
运用已知结果来求得未知。
代码如下:
#include<stdio.h> #include<stdlib.h> void NoIncreaseSubSeq(int data[], int length){ int (*status[100]), maxlength[100],templength = 0; //遍历整个数组 for(int j = 0; j < length; j++) { //为每个状态分配空间(最多为j+1个),各子序列初始状态长度为1 status[j] = (int*)malloc(sizeof(int) * (j + 1)); status[j][0] = data[j]; maxlength[j] = 1; //遍历已有最优子序列 for(int i = 0; i < j ; i++ ) //满足非增条件 if( data[j] <= status[i][maxlength[i] - 1] ) { templength = maxlength[i] + 1; //比之前更优 if(templength >= maxlength[j]) { maxlength[j] = templength; //优化子序列 for(int k = 0;k < maxlength[i]; k++) { status[j][k] = status[i][k]; } status[j][maxlength[j] - 1] =data[j]; } } } //打印结果,并释放内存空间 for(int j = 0; j < length; j++) { printf("第%d个最优子序列:\n",j); for(int i = 0; i <= maxlength[j] - 1; i++) { printf("%d ",status[j][i]); } free(status[j]); printf("\n"); } } int main() { int data[] = {1,2,2,3,8,19,17,13,1,2,5,4,8,1,9}; //计算得出length长度 int length = sizeof(data) / sizeof(int); NoIncreaseSubSeq(data,length); return 1; }
浙公网安备 33010602011771号