LIS最长上升子序列
题意:有一个长为n的数列,求出这个序列中最长的上升子序列长度(不连续,不能等于)。 解法1:简单dp(n 2 ) 思路: 状态设计:F [ i ] 代表以 A [ i ] 结尾的 LIS 的长度 状态转移:F [ i ] = max { F [ j ] + 1 ,F [ i ] } (1 <= j < i,A[ j ] < A[ i ]) 边界处理:F [ i ] = 1 (1 <= i <= n) 1 const int maxn = 103, INF = 0x7f7f7f7f; 2 int a[maxn], f[maxn]; 3 int n,ans = -INF; 4 int main() 5 { 6 scanf("%d", &n); 7 for(int i=1; i<=n; i++) 8 { 9 scanf("%d", &a[i]); 10 f[i] = 1; 11 } 12 for(int i=1; i<=n; i++) 13 for(int j=1; j<i; j++) 14 if(a[j] < a[i]) 15 f[i] = max(f[i], f[j]+1); 16 for(int i=1; i<=n; i++) 17 ans = max(ans, f[i]); 18 printf("%d\n", ans); 19 return 0; 20 } 解法2:贪心优化