-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathf.cpp
81 lines (64 loc) · 1.45 KB
/
f.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1e9 + 7;
ll int INF = 1e17;
int dp[3005][3005];
string s1, s2;
int kil(int idx1, int idx2)
{
if(idx1 == s1.length() || idx2 == s2.length())
return 0;
if(dp[idx1][idx2] != -1)
return dp[idx1][idx2];
if(s1[idx1] == s2[idx2])
dp[idx1][idx2] = max(dp[idx1][idx2], kil(idx1+1, idx2+1) + 1);
else
{
dp[idx1][idx2] = max(dp[idx1][idx2], kil(idx1, idx2+1));
dp[idx1][idx2] = max(dp[idx1][idx2], kil(idx1+1, idx2));
}
return dp[idx1][idx2];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string res="";
memset(dp, -1, sizeof dp);
cin>>s1>>s2;
// recursive
// kil(0, 0);
// iterative
memset(dp, 0, sizeof dp);
for(int idx1 = s1.length()-1; idx1>=0; idx1--)
for(int idx2 = s2.length()-1; idx2>=0; idx2--)
{
if(s1[idx1] == s2[idx2])
dp[idx1][idx2] = max(dp[idx1][idx2], dp[idx1+1][idx2+1] + 1);
else
{
dp[idx1][idx2] = max(dp[idx1][idx2], dp[idx1][idx2+1]);
dp[idx1][idx2] = max(dp[idx1][idx2], dp[idx1+1][idx2]);
}
}
int idx1=0, idx2=0;
while(idx1 != s1.length() && idx2 != s2.length())
{
if(s1[idx1] == s2[idx2])
{
res += s1[idx1];
idx1 += 1;
idx2 += 1;
}
else
{
if(dp[idx1][idx2] == dp[idx1+1][idx2] && dp[idx1][idx2] != -1)
idx1 += 1;
else
idx2 += 1;
}
}
cout<<res<<endl;
return 0;
}