采用最大子段和的改进算法,遍历数组,并记录开头和结尾。
#include<iostream> using namespace std; int main() { int sum=0,a[10],max=0,i=0,j,first,last; cout<<"请输入10个数:"<<endl; for(int b=0;b<10;b++) { cin>>a[b]; } for(i=0;i<10;i++) { for(j=i;j<10;j++) { if(a[j+1]>a[j]) { sum+=1; } else { sum=0; } if(sum>max) { max=sum; first=j+1-max; last=j+1; } } } cout<<"单调递增子序列长为:"<<max+1<<endl; cout<<"起始:"<<first<<"终止:"<<last<<endl; //数组序列从0开始 }
算法运用动态规划的思想改进后由O(n^2)变为O(n)(最优子结构,子问题重叠)
#include<iostream> using namespace std; int main() { int sequence(int *a); int a[10],h; cout<<"请输入10个数:"<<endl; for(int i=0;i<10;i++) { cin>>a[i]; } h=sequence(a); //数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素地址 cout<<"最大递增子序列长为:"<<h<<endl; return 0; } int sequence(int *a) { int b=0,sum=0,max=0,first,last; for(int j=0;j<10;j++) { b=a[j]; if(b<a[j+1]) { sum+=1; } else { sum=0; } if(sum+1>max) { max=sum+1; //记录项 last=j+1; first=last-sum; } } cout<<"first:"<<first<<" last:"<<last<<endl; return max; }