hdu 5087 Revenge of LIS II
2014-11-01 22:53
309 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5087
题意求第二长的上升序列。 在求最长上升序列的同时加上一个数组,来记录以i为结尾的有多少条序列。如果n+1为结尾有多条,就输出dp[n+1]-1;
否则在这个最长的序列上每一个节点是不是都是num[i]==1,如果是,就输出dp[n+1]-2;否则输出dp[n+1]-1;
View Code
题意求第二长的上升序列。 在求最长上升序列的同时加上一个数组,来记录以i为结尾的有多少条序列。如果n+1为结尾有多条,就输出dp[n+1]-1;
否则在这个最长的序列上每一个节点是不是都是num[i]==1,如果是,就输出dp[n+1]-2;否则输出dp[n+1]-1;
#include <cstdio> #include <cstring> #include <algorithm> #define maxn 1005 #define LL int using namespace std; int t; LL a[maxn]; int n; int dp[maxn]; int num[maxn]; int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); memset(dp,0,sizeof(dp)); memset(num,0,sizeof(num)); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } a[n+1]=1000000001; for(int i=1; i<=n+1; i++) { dp[i]=1; num[i]=1; for(int j=1; j<i; j++) { if(a[j]<a[i]&&dp[i]<dp[j]+1) { num[i]=1; dp[i]=dp[j]+1; } else if(a[j]<a[i]&&dp[i]==dp[j]+1) { num[i]++; } } } if(num[n+1]>1) printf("%d\n",dp[n+1]-1); else { int pos=n+1,j; while(pos>0&&num[pos]==1) { for(j=pos-1; j>=1; j--) { if(dp[j]+1==dp[pos]&&a[j]<a[pos]) break; } pos=j; } if(pos==0) printf("%d\n",dp[n+1]-2); else printf("%d\n",dp[n+1]-1); } } return 0; }
View Code
相关文章推荐
- HDU 5087 Revenge of LIS II(次长上升子序列)
- hdu5087——Revenge of LIS II
- HDU 5087 Revenge of LIS II(BestCoder Round #16)(次长上升子序列)
- hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)
- Revenge of LIS II(HDU 5087)
- Revenge of LIS II (hdu 5087 LIS)
- hdu 5087 Revenge of LIS II
- hdu 5087 Revenge of LIS II(BestCoder Round #16)
- 【DP】 HDU 5087 Revenge of LIS II
- hdu 5087 Revenge of LIS II (DP)
- 【DP】 HDU 5087 Revenge of LIS II
- hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)
- hdu 5087 Revenge of LIS II(LIS,思路)
- HDU5087——Revenge of LIS II(BestCoder Round #16)
- HDU 5087 Revenge of LIS II(次大递增子序列)
- HDU - 5087 Revenge of LIS II
- hdu 5087 Revenge of LIS II(LIS)
- HDOJ 题目5087 Revenge of LIS II(第二长LIS)
- hdu 5087 Revenge of LIS II 题解(DP) BestCoder Round #16 1002
- hdu 5087 Revenge of LIS II