├── README.md
├── code(A - Frog 1).cpp
├── code(B - Frog 2).cpp
├── code(C - Vacation).cpp
├── code(D - Knapsack 1).cpp
├── code(E - Knapsack 2).cpp
├── code(F - LCS).cpp
├── code(H - Grid 1).cpp
├── code(I - Coins)_EasyApproach.cpp
├── code(I - Coins)_HardApproach.cpp
├── code(J - Sushi).cpp
├── code(K - Stones).cpp
├── code(L - Deque).cpp
├── code(M - Candies).cpp
├── code(N - Slimes).cpp
├── code(O - Matching).cpp
└── code(S - Digit Sum).cpp
/README.md:
--------------------------------------------------------------------------------
1 | I am Listing below the concepts I have used whilst solving the questions.
2 |
3 | |
PROBLEMS
| CONCEPTS USED
|
4 | | ------------- | ------------- |
5 | | Frog 1 | Classical DP Approach, Bottom Up DP |
6 | | Frog 2 | Classical DP Approach, Bottom Up DP |
7 | | Vacation | Bottom Up DP |
8 | | Knapsack 1 | Classical DP Approach, Top Down DP |
9 | | Knapsack 2 | Classical DP (with a twist), Bottom Up DP |
10 | | LCS | Top Down DP Approach |
11 | | Longest Path | |
12 | | Grid 1 | Grid DP, Bottom Up DP |
13 | | Coins | Probability DP, Bottom Up DP(Hard), Top Down DP(Easy) |
14 | | Sushi | Expected Value DP, Mathematics |
15 | | Stones | Game Theory and DP |
16 | | Deque | Game Theory and Multi-dimensional DP |
17 | | Candies | Multidimensional DP optimisation |
18 | | Slimes | DP over intervals |
19 | | Matching | DP + Bitmasking |
20 | | Independent Set | |
21 | | Flowers | |
22 | | Walk ||
23 | | Digit Sum | Digit DP |
24 |
--------------------------------------------------------------------------------
/code(A - Frog 1).cpp:
--------------------------------------------------------------------------------
1 |
2 |
3 | #include
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define pb push_back
7 | #define mp make_pair
8 | #define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
9 | using namespace std;
10 |
11 | int main()
12 | {
13 | fast_io;
14 |
15 | ll n;
16 | cin>>n;
17 | vector h(n+1);
18 |
19 | for(ll i=0;i>h[i];
21 | vector dp(n+1);
22 |
23 | //base case
24 | dp[0] = 0;
25 | dp[1] = h[1] - h[0];
26 |
27 | //BU
28 | for(ll i=2;i
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define pb push_back
7 | #define mp make_pair
8 | #define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
9 | using namespace std;
10 |
11 | int main()
12 | {
13 | fast_io;
14 |
15 | ll n,k;
16 | cin>>n>>k;
17 |
18 | vector h(n+1);
19 |
20 | for(ll i=0;i>h[i];
22 | vector dp(n+1);
23 |
24 | //base case
25 | dp[0] = 0;
26 |
27 | for(ll i=1;i=0 && (i-j)<=k;j--)
31 | {
32 | dp[i] = min(dp[i], abs(h[j] - h[i]) + dp[j]);
33 | }
34 | }
35 | cout<
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define pb push_back
7 | #define mp make_pair
8 | #define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
9 | using namespace std;
10 |
11 | struct act
12 | {
13 | ll a,b,c;
14 | };
15 |
16 | int main()
17 | {
18 | fast_io;
19 |
20 | ll n;
21 | cin>>n;
22 | vector v(n+1);
23 |
24 | for(ll i=1;i<=n;i++)
25 | {
26 | cin>>v[i].a;
27 | cin>>v[i].b;
28 | cin>>v[i].c;
29 | }
30 |
31 | ll dp[n+1][3];
32 | //Base case
33 | dp[1][0] = v[1].a;
34 | dp[1][1] = v[1].b;
35 | dp[1][2] = v[1].c;
36 |
37 | //BU
38 | for(ll i=2;i<=n;i++)
39 | {
40 | dp[i][0] = v[i].a + max(dp[i-1][1], dp[i-1][2]);
41 | dp[i][1] = v[i].b + max(dp[i-1][0], dp[i-1][2]);
42 | dp[i][2] = v[i].c + max(dp[i-1][0], dp[i-1][1]);
43 | }
44 |
45 | cout<< max(dp[n][0], max(dp[n][1], dp[n][2])) <
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define endl '\n'
7 | #define pb push_back
8 | #define mp make_pair
9 | #define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
10 | using namespace std;
11 |
12 | //ll dp[101];
13 | ll dp[101][100005];
14 | /*struct ks
15 | {
16 | ll weight,value;
17 | };*/
18 |
19 | ll fun(ll w, ll n, ll weight[], ll value[])
20 | {
21 |
22 | //Base case
23 | if(n==0)
24 | return 0;
25 | if(w <= 0)
26 | return 0;
27 |
28 | //Lookup
29 | if(dp[n][w] != -1)
30 | return dp[n][w];
31 |
32 | //Rec case
33 | ll op1 = (w-weight[n] >= 0) ? (value[n] + fun(w-weight[n], n-1,weight, value)) : INT_MIN;
34 | ll op2 = fun(w, n-1,weight,value);
35 |
36 | return dp[n][w] = max(op1, op2);
37 | }
38 |
39 | int main()
40 | {
41 | fast_io;
42 |
43 | ll n,w;
44 | cin>>n>>w;
45 | //vector ar;
46 | ll weight[n+1],value[n+1];
47 |
48 | for(ll i=1;i<=n;i++)
49 | cin>>weight[i]>>value[i];
50 |
51 | memset(dp,-1,sizeof(dp));
52 | cout<
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define endl '\n'
7 | #define pb push_back
8 | #define mp make_pair
9 | #define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
10 | using namespace std;
11 |
12 | int main()
13 | {
14 | ll n,w;
15 | cin>>n>>w;
16 |
17 | vector weight(n),value(n);
18 | for(ll i=0;i>weight[i]>>value[i];
20 |
21 | ll max_val = 0;
22 | for(ll&x : value)
23 | max_val += x;
24 |
25 | vector dp(max_val+1,INT_MAX);
26 | dp[0] = 0;
27 |
28 | for(ll i=0;i=0;j--)
31 | {
32 | dp[j+value[i]] = min(dp[j+value[i]], dp[j]+weight[i]);
33 | }
34 | }
35 | ll ans = INT_MIN;
36 | for(ll i=0;i<=max_val;i++)
37 | {
38 | if(dp[i] <= w)
39 | ans = max(ans, i);
40 | }
41 |
42 | cout<
3 | #define ll long long
4 | #define ull unsigned long long
5 | #define endl '\n'
6 | #define pb push_back
7 | #define mp make_pair
8 | #define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
9 | using namespace std;
10 |
11 | const ll v = 3001;
12 | ll dp[v][v];
13 |
14 | ll length(string& s,string& t,ll i,ll j)
15 | {
16 | // memset(dp,-1,sizeof(dp));
17 | //Base case
18 | if(i>=s.size() || j>=t.size())
19 | return 0;
20 |
21 | //Lookup
22 | if(dp[i][j] != -1)
23 | return dp[i][j];
24 |
25 | //Rec case
26 | if(s[i] == t[j])
27 | return dp[i][j] = 1 + length(s,t,i+1,j+1);
28 |
29 | else
30 | return dp[i][j] = max(length(s,t,i+1,j), length(s,t,i,j+1));
31 | }
32 |
33 | int main()
34 | {
35 | fast_io;
36 | string s,t;
37 | cin>>s>>t;
38 | memset(dp,-1,sizeof(dp));
39 |
40 | //cout< dp[i+1][j])
57 | j++;
58 | else
59 | i++;
60 | }
61 | }
62 | cout<
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define endl '\n'
7 | #define pb push_back
8 | #define mp make_pair
9 | #define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
10 | using namespace std;
11 |
12 | int main()
13 | {
14 | fast_io;
15 | ll ro,co;
16 | cin>>ro>>co;
17 | ll mod = 1e9+7;
18 |
19 | vector< vector> dp(ro+1, vector (co+1,0));
20 | dp[0][0] = 1;
21 |
22 | for(ll i=0;i>s;
26 | for(ll j=0;j0)
31 | {
32 | dp[i][j] += dp[i-1][j];
33 | dp[i][j] %= mod;
34 | }
35 | if(j>0)
36 | {
37 | dp[i][j] += dp[i][j-1];
38 | dp[i][j] %= mod;
39 | }
40 | }
41 | else
42 | dp[i][j] = 0;
43 |
44 | }
45 | }
46 | cout<
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define endl '\n'
7 | #define pb push_back
8 | #define mp make_pair
9 | #define sp(x) fixed<> dp(3001,vector(3001,-1));
14 | double dp[3001][3001];
15 | double fun(vector &p, int i, int atleast_heads)
16 | {
17 | //Base case
18 | if(atleast_heads == 0)
19 | return 1;
20 |
21 | if(i == 0)
22 | return 0;
23 |
24 | //Lookup
25 | if(dp[i][atleast_heads] > -0.9)
26 | return dp[i][atleast_heads];
27 |
28 | //Rec case
29 | //double op1 = p[i]*fun(p,i-1,atleast_heads-1);
30 | //double op2 = (1-p[i])*fun(p,i-1,atleast_heads);
31 | return dp[i][atleast_heads] = p[i]*fun(p,i-1,atleast_heads-1) + (1-p[i])*fun(p,i-1,atleast_heads);
32 | }
33 |
34 | int main()
35 | {
36 | fast_io;
37 |
38 | memset(dp,-1,sizeof(dp));
39 | int n;
40 | cin>>n;
41 | vector p(n+1);
42 |
43 | for(int i=1;i<=n;i++)
44 | cin>>p[i];
45 |
46 | cout<
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define endl '\n'
7 | #define pb push_back
8 | #define mp make_pair
9 | #define sp(x) fixed<>n;
19 | double p;
20 | double ans=0;
21 |
22 | vector dp(n+1);
23 | dp[0] = 1;
24 |
25 | for(int coins=0;coins>p;
28 | for(int i=coins+1;i>=0;i--)
29 | {
30 | // double s = (i==0) ? 0 : p*dp[i-1];
31 | dp[i] = (i==0 ? 0 : p*dp[i-1] )+ dp[i]*(1-p);
32 | }
33 | }
34 |
35 | for(int heads=0;heads<=n;heads++)
36 | {
37 | int tails = n-heads;
38 | if(heads > tails)
39 | ans += dp[heads];
40 | }
41 | cout<
3 | #define ll long long
4 | #define ull unsigned long long
5 | #define endl '\n'
6 | #define pb push_back
7 | #define mp make_pair
8 | #define sp(x) fixed< -0.9)
25 | return dp[x][y][z];
26 |
27 | //Rec case
28 | double ans = n + (x*fun(n,x-1,y,z)) + (y*fun(n,x+1,y-1,z)) + (z*fun(n,x,y+1,z-1));
29 | return dp[x][y][z] = ans/(x+y+z);
30 | }
31 |
32 | int main()
33 | {
34 | fast_io;
35 |
36 | memset(dp,-1,sizeof(dp));
37 | int n,j;
38 | cin>>n;
39 |
40 | int o=0,tw=0,th=0;
41 |
42 | for(int i=0;i>j;
45 | if(j == 1)
46 | o++;
47 | else if(j == 2)
48 | tw++;
49 | else
50 | th++;
51 | }
52 | cout<
3 | #define ll long long
4 | #define ull unsigned long long
5 | #define endl '\n'
6 | #define pb push_back
7 | #define mp make_pair
8 | #define sp(x) fixed<>n>>k;
18 |
19 | vector v(n);
20 | for(int& i : v)
21 | cin>>i;
22 |
23 | vector dp(k+1,0);
24 | for(int i=0;i<=k;i++)
25 | {
26 | for(int move : v)
27 | {
28 | if(i-move>=0 && dp[i-move]==0)
29 | dp[i] = 1;
30 | }
31 | }
32 |
33 | (dp[k]>0) ? cout<<"First" : cout<<"Second";
34 |
35 | return 0;
36 | }
37 |
--------------------------------------------------------------------------------
/code(L - Deque).cpp:
--------------------------------------------------------------------------------
1 |
2 |
3 | #include
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define endl '\n'
7 | #define pb push_back
8 | #define mp make_pair
9 | #define sp(x) fixed<& a, ll i, ll j)
17 | {
18 | //Base case
19 | if(i > j)
20 | return 0;
21 |
22 | //Lookup
23 | if(dp[i][j] != -1)
24 | return dp[i][j];
25 |
26 | //Rec Case
27 | ll op1 = a[i] + min( solve(a,i+1,j-1), solve(a,i+2,j));
28 | ll op2 = a[j] + min( solve(a,i+1,j-1), solve(a,i,j-2));
29 |
30 | return dp[i][j] = max(op1,op2);
31 | }
32 |
33 | int main()
34 | {
35 | fast_io;
36 |
37 | ll n;
38 | cin>>n;
39 | vector a(n+1);
40 |
41 | for(int i=0;i>a[i];
43 |
44 | memset(dp,-1,sizeof(dp));
45 | ll X = solve(a,0,n-1);
46 |
47 | ll sum = 0;
48 | for(ll j=0;j
3 | #define ll long long
4 | #define ull unsigned long long
5 | #define endl '\n'
6 | #define pb push_back
7 | #define mp make_pair
8 | #define sp(x) fixed<& a, ll n, ll k)
16 | {
17 | //Base case
18 | for(ll j=0;j<=k;j++)
19 | dp[1][j] = (j > a[1]) ? 0 : 1;
20 |
21 | //BU
22 | for(ll i=2;i<=n;i++)
23 | {
24 | for(ll j=0;j<=k;j++)
25 | {
26 | if(j == 0)
27 | {
28 | dp[i][j] = dp[i-1][j];
29 | dp[i][j] = (mod + dp[i][j])%mod;
30 | }
31 | else
32 | {
33 | dp[i][j] = dp[i-1][j] + dp[i][j-1] - ( (j-1-a[i] >= 0) ? dp[i-1][j-1-a[i]] : 0);
34 | dp[i][j] = (mod + dp[i][j])%mod;
35 | }
36 | }
37 | }
38 | return dp[n][k];
39 | }
40 |
41 | int main()
42 | {
43 | fast_io;
44 |
45 | ll n,k;
46 | cin>>n>>k;
47 |
48 | vector a(n+1);
49 | for(ll i=1;i<=n;i++)
50 | cin>>a[i];
51 |
52 | cout<
3 | #define ll long long
4 | #define ull unsigned long long
5 | #define endl '\n'
6 | #define pb push_back
7 | #define mp make_pair
8 | #define sp(x) fixed< j)
31 | return 0;
32 |
33 | //Lookup
34 | if(dp[i][j] != -1)
35 | return dp[i][j];
36 |
37 | //Rec Case
38 | ll ans = infinity;
39 | for(ll k=i;k>n;
53 | for(ll i=0;i>s[i];
55 |
56 | for(ll i=1;i
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define endl '\n'
7 | #define pb push_back
8 | #define mp make_pair
9 | #define sp(x) fixed<> &comp, ll N, ll i, ll woman_bit)
16 | {
17 | //Base case
18 | if(i == N+1)
19 | {
20 | if(woman_bit == 0)
21 | return 1;
22 | return 0;
23 | }
24 |
25 | //Lookup
26 | if(dp[i][woman_bit] != -1)
27 | return dp[i][woman_bit];
28 |
29 | //Rec case
30 | ll ans = 0;
31 | for(ll w=0;w>N;
50 |
51 | vector< vector> comp(N+1, vector(N+1));
52 | //int comp[22][22];
53 | for(ll i=1;i<=N;i++)
54 | {
55 | for(ll j=1;j<=N;j++)
56 | cin>>comp[i][j];
57 | }
58 |
59 | memset(dp,-1,sizeof(dp));
60 | cout<
4 | #define ll long long
5 | #define ull unsigned long long
6 | #define endl '\n'
7 | #define pb push_back
8 | #define mp make_pair
9 | #define sp(x) fixed<>k>>D;
29 | int length = strlen(k);
30 |
31 | vector< vector> dp (D, vector (2));
32 | dp[0][0] = 1;
33 |
34 | for(int pos=0;pos> dp1(D, vector(2));
37 | for(int sum=0;sum pos[k]-'0' && small == false)
45 | break;
46 |
47 | add_store( dp1[(sum+dig)%D][small || dig < pos[k]-'0'], dp[sum][small]);
48 | }
49 | }
50 | }
51 | dp = dp1;
52 | }
53 |
54 | int ans = dp[0][true] + dp[0][false];
55 | int res = (ans%mod)-1;
56 |
57 | //res =0 ? cout<