文章
12
粉丝
0
获赞
9
访问
803
通过率40%,复杂度是n2,怀疑是超时的原因
为什么采用从后往前的dp:如果使用从前往后的dp,next数组中保存的是 该元素 从头到该元素这个区间中最长递减子序列的上个元素的下标,等dp结束后,根据next数组中保存的子序列下标遍历数组时,输出是倒序,故采用从后往前的dp。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
vector<int> buf;
vector<int> dp;
vector<int> next;
int x;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>x;
buf.push_back(x);
dp.push_back(1);
next.push_back(-1);
}
int maxn=0;
int start=0;
for(int i=n-2; i>=0; i--)
{
for(int j=n-1; j>i; j--)
{
if(buf[i]>buf[j] && dp[j]+1>dp[i])
 ...
登录后发布评论
太离谱了,不是超时的原因,是测试点的原因
输入测试:
5
9 4 8 2 1
此程序输出9 8 2 1
而答案是9 4 2 1
dp[j]+1>dp[i]应改成dp[j]+1>=dp[i] 此时正确率80
输入测试:
6
9 4 3 20 15 10
此程序输出20 15 10
而答案是9 4 3
将if(dp[i]>maxn)改成if(dp[i]>=maxn) 此时ac