272. 最长公共上升子序列 ###K ###K //K

题目链接:https://www.acwing.com/problem/content/274/

思路: dp[i][j] 表示 已经走到 a[i] 且结尾为b[j] 的最大值     以a[i] 取和不取 为分界点 不取的话 就是 dp[i-1][j] 

要取的话  只有当a[i]==b[j]的时候可以取   但这样还要枚举k (1~j-1) 得dp[i-1][k] 的最大值  条件是b[j]>b[k]

因为a[i]==b[j] 所以 可以在枚举i的时候 就确定mx = dp[i-1][j-1] 这样就可以优化成两重循环

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=3e3+10;
 4 const int mod=1e9+7;
 5 #define ll long long
 6 #define pi pair<int,int>
 7 #define fi first
 8 #define sc second
 9 #define pb push_back
10 
11 
12 int n;
13 int a[maxn],b[maxn];
14 int dp[maxn][maxn];
15 
16 
17 int main()
18 {
19     ios::sync_with_stdio(0);
20     cin.tie(0);
21     cin>>n;
22     for(int i=1;i<=n;i++) cin>>a[i];
23     for(int i=1;i<=n;i++) cin>>b[i];
24 
25     for(int i=1;i<=n;i++)
26     {
27         int mx=0;
28         for(int j=1;j<=n;j++)
29         {
30             dp[i][j]=dp[i-1][j];
31             if(a[i]==b[j]) dp[i][j]=mx+1;
32             if(a[i]>b[j]) mx=max(mx,dp[i-1][j]);
33         }
34     }
35 
36     int ans=0;
37     for(int i=1;i<=n;i++) ans=max(ans,dp[n][i]);
38     cout<<ans<<'\n';
39 
40 
41 
42 
43 }
View Code

 

posted @ 2021-04-03 19:32  canwinfor  阅读(51)  评论(0)    收藏  举报