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 }

浙公网安备 33010602011771号