动态规划-最长递增子序列
求一串数字中的最长递增子序列,并且知道当前数字在序列中的位置,可采取动态规划的方式进行
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
多学习,多记录,多进步!