1、動態規劃法
#include #define max 1000
int seq[max+10];
int seqlen[max+10];
int main()
seqlen[i]=max+1;
if(seqlen[i]>maxlen) //seqlen中儲存的是第i個數為終點的最長上公升序列,找出這個陣列中最大的值即為最優序列長度
maxlen=seqlen[i];
} printf("%d/n",maxlen);
return 0;
}
2、nlog(n)複雜度解法
#include #include#includeusing namespace std;
#define maxn 50010
typedef long long ll;
ll arr[maxn],ans[maxn],len;
int main()
ans[1]=arr[1];
len=1;
for(i=2;i<=p;i++)
} printf("%lld\n",len);
// }
return 0;
}
3、lcs方法
先將序列從小到大排序,然後用最長公共子串行(lcs)去匹配
下面給出lcs演算法的實現:(複雜度為n^2)
#include#include#includeusing namespace std;
const int maxn = 1e3 + 10;
char a[maxn],b[maxn],ans[maxn];
int dp[maxn][maxn];
int main()else dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
} }
int cur = 0;
for(int i = n,j = m;dp[i][j];--i,--j)
reverse(ans,ans+cur);
ans[cur] = '\0';
printf("%s\n",ans);
return 0;
}
最長上公升子串行(模板)
include include include include using namespace std int n,q int stack 100100 char s 100100 intdp int start else else stack low s i return top int main...
最長上公升子串行(DP 模板)
有兩個不可描述的線段,每個上面有 n 個介面,現在給定了乙個連線,求如果減去一些連線的話,最大的不交叉連線個數是多少。省賽選拔賽的題,英文題面太長直接沒看。理解題意後挺簡單的,只要找到規律。要求最大的不交叉,可以找到乙個規律,就是求不遞減子串行,不過這裡用 o n 2 的會超時,所以用了乙個 o n...
最長上公升子串行LIS模板
有兩種演算法複雜度為 o n logn 和 o n 2 o n 2 演算法分析如下 a 1 a n 存的都是輸入的數 1 對於a n 來說.由於它是最後乙個數,所以當從a n 開始查詢時,只存在長度為1的上公升子串行 2 若從a n 1 開始查詢.則存在下面的兩種可能性 1 若a n 1 a n 則...