题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5087
题意:
求第二长的最长递增序列的长度
分析:
用step[i]表示以i结尾的最长上升序列的长度,dp[i]表示到i的不同的最长的子序列的个数
然后最后判断最长的子序列的个数是否大于1是的话输出Max,否则输出Max-1
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1005; int step[maxn],dp[maxn], num[maxn]; int main () { int T; scanf("%d", &T); while(T--){ int n; scanf("%d", &n); memset(dp, 0, sizeof(dp)); memset(step, 0, sizeof(step)); dp[0] = 1; for(int i = 1; i <= n; i++) scanf("%d", &num[i]); int Max = -1; for(int i = 1; i <= n; i++){ for(int j = 0; j < i; j++){ if(num[i] > num[j]){ if(step[j]+1 > step[i]){ step[i] = step[j] + 1; dp[i] = dp[j]; } else if(step[j] + 1 == step[i]) dp[i] += dp[j]; } } Max = max(Max, step[i]); } int flag = 0; int ok = 1; for(int i = 1; i <= n; i++){ if(step[i] == Max){ if(dp[i] > 1) ok = 0; else{ if(flag) ok = 0; flag = 1; } } } printf("%d\n", Max - ok ); } return 0; }
时间: 2024-10-13 16:05:40