---
# System prepended metadata

title: AISD LISTA 3

---

# AISD LISTA 3

Podpunkty a i b są wspólne. W a) zwracamy LIS[n][m][6],
w b) max(LIS[n][m][0-5])

![](https://i.imgur.com/udGkMUQ.png)


```javascript=
liczby poza tablicą dp[n][m][k] np dp[0][-1][2] są równe zero
char znak[]{null,m,a,t,u,r,a}
for (i in range(n)) { // iteracja "w dół"
    for (j in range(m)) { // iteracja "w prawo"
        for (k in range(7)) { // iteracja po tablicach -> "literkach"
            dp[i][j][k] = max(dp[i-1][j][k], dp[i][j-1][k])

            if(s1[i] == s2[j]) {
                if (s1[i] == znak[k]) {
                    dp[i][j][k] = max(dp[i-1][j-1][k-1] + 1, dp[i][j][k])
                }                
                else {
                     dp[i][j][k] = max(dp[i-1][j-1][k] + 1, dp[i][j][k])
                }
            }
        }      
    }      
}

```

Podpunkty c i d również wspólnie - zwrócimy wartość jak w a) i b) (analogicznie):

```javascript=
dp[n][m][k] oznacza najdłuższy wspólny podciąg dla 2 prefixów, że zawiera dokładnie k pierwszych liter "matura" na samym końcu, lub (w przypadku 6) kiedykolwiek w środku zawierał całe słowo "matura"



char znak[]{null,m,a,t,u,r,a}
for (i in range(n)) { // iteracja "w dół"
    for (j in range(m)) { // iteracja "w prawo"
        for (k in range(7)) { // iteracja po tablicach -> "literkach"
            dp[i][j][k] = max(dp[i][j-1][k], dp[i-1][j][k])
            
            if (k == 0) {
                 for (other_k in range(6)) { // other_k -> 3, znak[other_k + 1] = "u", s1[i]= "p"
                     if (s1[i] == s2[j] !== znak[other_k + 1]) {
                         dp[i][j][0] = max(dp[i][j][0], dp[i-1][j-1][other_k] + 1)
                     }
 
                 }
            }     
            
            else if (k == 6) {
                if (s1[i] == s2[j] == znak[k]) {
                    dp[i][j][k] = max(dp[i-1][j-1][k-1] + 1, dp[i][j][k])
                }                
                if (s1[i] == s2[j]) {
                    dp[i][j][k] = max(dp[i-1][j-1][k] + 1, dp[i][j][k])
                }
            }          
            
            else {
                if (s1[i] == s2[j] == znak[k]) {
                    dp[i][j][k] = max(dp[i-1][j-1][k-1] + 1, dp[i][j][k])
                } 
            }
        }
    }
}

```
## MW C++
### a,b
```cpp=
#include <bits/stdc++.h>
using namespace std;
constexpr int MAXN = 1e1 + 7;
constexpr int INF = 1e9;

int dp[MAXN][MAXN][7];
int n, m, mSize;

void initDp() {
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            dp[i][j][0] = 0;
            for (int k = 1; k <= mSize; k++) {
                dp[i][j][k] = -INF;
            }
        }
    }
}
int main() {
    string matura = "matura";
    string x = "mabtursafe";
    string y = "maturasa";
    mSize = matura.size();

    n = x.size();
    m = y.size();

    x = "$" + x;
    y = "$" + y;
    matura = "$" + matura + "$";

    initDp();

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            for (int k = 0; k <= mSize; k++) {
                dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j - 1][k]);

                if (x[i] == y[j]) {
                    if (x[i] == matura[k]) {
                        dp[i][j][k] = max(dp[i - 1][j - 1][k - 1] + 1, dp[i][j][k]);
                    } else if (x[i] != matura[k + 1]) {
                        dp[i][j][k] = max(dp[i - 1][j - 1][k] + 1, dp[i][j][k]);
                    }
                }
            }
        }
    }

    cout << "A:" << dp[n][m][mSize] << endl;
    int mx = 0;

    for (int i = 0; i < mSize; i++) {
        mx = max(dp[n][m][i], mx);
    }

    cout << "B:" << mx << endl;
}
```
### c, d
```cpp=
#include <bits/stdc++.h>
using namespace std;
constexpr int MAXN = 1e1 + 7;
constexpr int INF = 1e9;

int dp[MAXN][MAXN][7];
int n, m, mSize;

void initDp() {
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            dp[i][j][0] = 0;
            for (int k = 1; k <= mSize; k++) {
                dp[i][j][k] = -INF;
            }
        }
    }
}
int main() {
    string matura = "mt";
    string x = "mbtu";
    string y = "mtu";
    mSize = matura.size();

    n = x.size();
    m = y.size();

    x = "$" + x;
    y = "$" + y;
    matura = "$" + matura + "$";

    initDp();

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            for (int k = 0; k <= mSize; k++) {
                dp[i][j][k] = max(dp[i][j - 1][k], dp[i - 1][j][k]);

                if (k == 0) {
                    for (int other_k = 0; other_k < mSize; other_k++) {
                        if (x[i] == y[j] && y[j] != matura[other_k + 1]) {
                            dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - 1][other_k] + 1);
                        }
                    }
                    continue;
                }

                // k != 0
                if (x[i] == y[j] && y[j] == matura[k]) {
                    dp[i][j][k] = max(dp[i - 1][j - 1][k - 1] + 1, dp[i][j][k]);
                }
                if (k == mSize) {
                    if (x[i] == y[j] && x[i] != matura[k + 1]) {
                        dp[i][j][k] = max(dp[i - 1][j - 1][k] + 1, dp[i][j][k]);
                    }
                }
            }
        }
    }

    cout << "C:" << dp[n][m][mSize] << endl;
    int mx = 0;

    for (int i = 0; i < mSize; i++) {
        mx = max(dp[n][m][i], mx);
    }

    cout << "D:" << mx << endl;
}
```