动态规划代码模板:
int main()
{
//input
//...
//init
//如果初始值是0+数组为全局数组则不需要初始化。其他情况均需要初始化!
//...
//状态转移
//for(int i = 1; i <= n; i++)
//for(int j = 1; j <= m; j++)
//...
//output
//跟状态表示相关,有的是输出dp[n][m],有的则需要输出max(dp[i])
//..
}
本题题解:
#include<iostream>
using namespace std;
const int N = 1010;
int a[N];
int f[N]; //f[i]表示以a[i]结尾的严格单增(>)子序列的长度
int main()
{
int n, res = 0;
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++){
f[i] = 1; //Important!
for(int j = 1; j < i; j++){
if(a[i] > a[j]) f[i] = max(f[i], f[j] + 1);
}
res = max(res, f[i]); //Important!
}
cout << res << endl;
}