題目解析
最長公共子序列 + 最長上升子序列
在最長公共子序列的基礎上進行一下變形,每一次添加長度的時候進行判斷是否大於前面的數,即可
HDU6078 是這個問題的進階版,屬於數論DP
代碼
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 600 + 10;
int n, m;
int a[maxn], b[maxn];
int dp[maxn][maxn];
int main()
{
int T_T;
scanf("%d", &T_T);
while(T_T--)
{
memset(a, 0 , sizeof(a));
memset(b, 0 , sizeof(b));
memset(dp, 0 , sizeof(dp));
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
scanf("%d", &m);
for(int i = 1; i <= m; i++) scanf("%d", &b[i]);
int ans = 0;
int add;
for(int i = 1; i <= n; i++)
{
add = 0;
for(int j = 1; j <= m ; j++)
{
dp[i][j] = dp[i-1][j];
if(a[i] == b[j])
{
dp[i][j] = add + 1;
}
else if(a[i] > b[j]) ///如果大於 這個時候更新
{
if(add < dp[i-1][j])
add = dp[i-1][j];
}
}
}
for(int i = 1; i <= m ; i++)
ans = max(ans, dp[n][i]);
printf("%d\n", ans);
if(T_T)
printf("\n");
}
return 0;
}