最长公共子序列
注意:题设中没有说 数组中选取的元素必须连续出现
计算最优值
子问题递归结构
#include<bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include<stdio.h>
using namespace std;
int c[999][999];
void LCS(string a,string b){
//i,j==0是一个临界条件,起始条件
//i,j从 1 开始,size()结束
for(int i=1;i<=a.size();i++){
for(int j=1;j<=b.size();j++){
// a[i-1]==a[0]第一个元素 对应 c[1][*]第二行元素
// b[i-1]==a[0]第一个元素 对应 c[*][1]第二列元素
if(a[i-1]==b[j-1])
c[i][j]=c[i-1][j-1]+1;
else
c[i][j]=max(c[i-1][j],c[i][j-1]);
}
}
}
int main()
{
string a,b;
cin>>a;
cin>>b;
LCS(a,b);
for(int i=0;i<=a.size();i++){
for(int j=0;j<=b.size();j++){
cout<<c[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
最大子段和
注意: 需要考虑全为负的极端情况
#include<bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include<stdio.h>
using namespace std;
int MaxSubsequenceSum(int a[],int n){
int tmp=0;
int maxSum=0;
int tag=0;
for(int i=0;i<n;i++){
tmp=tmp>0?tmp+a[i]:a[i];
//tmp为正值时,一直累加 maxSum=max(tmp)
//tmp为负值时,tmp=a[i],以此位置重新开始累加
if(tmp>maxSum)
maxSum=tmp;
}
//全为负数时
if(maxSum==0){ //tmp一直为负值时,maxSum就一直为0
maxSum=a[0];
for(int i=1;i<n;i++)
if(a[i]>maxSum)
maxSum=a[i];
}
return maxSum;
}
int main()
{
int n;
cin>>n;
int a[999];
for(int i=0;i<n;i++)
cin>>a[i];
cout<<"最大子段和:"<<MaxSubsequenceSum(a,n);
return 0;
}