求一串数字中的最长递增子序列,并且知道当前数字在序列中的位置,可采取动态规划的方式进行
num[n] = {7 5 9 8 10 12 11 6 15 16}
首先假设dp[n] = 1,先初始化全为1
之后,假设i为当前数字,j为i前面的某一个数字
若num[i] > num[j] 并且 dp[i] < dp[j]+1 表示i位大于j位,但是其序列小,此时则更新dp[i]
dp[i] = dp[j] +1;
核心代码如下
for( int i=1; i<n; ++i ){
for( int j=i-1; j>=0; --j ){
if( num[i] > num[j] && dp[i]<dp[j]+1 )
dp[i] = dp[j]+1
}
}
对{7 5 9 8 10 12 11 6 15 16}进行分析
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> vi(n);
for( int i=0; i<n; ++i ){
cin >> vi[i];
}
vector<int> dp(n,1);
for( int i=1; i<n; ++i ){
for( int j=i-1; j>=0; --j ){
if( vi[i]>vi[j] && dp[i]<dp[j]+1 )
dp[i] = dp[j]+1;
}
}
for( auto a:dp ){
cout << a << " ";
}
return 0;
}
10
7 5 9 8 10 12 11 6 15 16
1 1 2 2 3 4 4 2 5 6
bingo!打卡!
多学习,多记录,多进步!