Skip to content

Commit fb1c6f7

Browse files
add some cses-dynamic-programming problems solutions
1 parent c8e611a commit fb1c6f7

File tree

7 files changed

+203
-0
lines changed

7 files changed

+203
-0
lines changed

CSES/Dynamic Programming/cses1158.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <algorithm>
2+
#include <cstdio>
3+
#include <cstring>
4+
5+
using namespace std;
6+
7+
const int N = 1e3 + 5, M = 1e5 + 2, OO = 0x3f3f3f3f, MOD = 1e9 + 7;
8+
9+
int n, x;
10+
int H[N], S[N];
11+
12+
int dp[2][M]; // availableBooks, remainingMoney
13+
14+
int solve() {
15+
fill(dp[0], dp[0] + x + 1, 0);
16+
dp[0][0] = dp[1][0] = 0;
17+
18+
for (int availableBooks = 1; availableBooks <= n; availableBooks++) {
19+
dp[availableBooks & 1][0] = 0;
20+
for (int remainingMoney = 1; remainingMoney <= x; remainingMoney++) {
21+
dp[availableBooks & 1][remainingMoney] =
22+
dp[(availableBooks - 1) & 1][remainingMoney];
23+
if (remainingMoney >= H[availableBooks]) {
24+
dp[availableBooks & 1][remainingMoney] =
25+
max(dp[availableBooks & 1][remainingMoney],
26+
dp[(availableBooks - 1) & 1][remainingMoney - H[availableBooks]] + S[availableBooks]);
27+
}
28+
}
29+
}
30+
return dp[n&1][x];
31+
}
32+
33+
int main() {
34+
scanf("%d %d", &n, &x);
35+
for (int i = 1; i <= n; i++) {
36+
scanf("%d", H + i);
37+
}
38+
for (int i = 1; i <= n; i++) {
39+
scanf("%d", S + i);
40+
}
41+
printf("%d\n", solve());
42+
return 0;
43+
}

CSES/Dynamic Programming/cses1633.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#include <cstdio>
2+
3+
using namespace std;
4+
5+
const int N = 1e6+5, MOD = 1e9+7;
6+
7+
int n;
8+
int dp[N];
9+
10+
int main() {
11+
scanf("%d", &n);
12+
dp[0] = 1;
13+
for (int i = 1; i <= n; i++) {
14+
for (int k = 1; k <= 6 && (i - k) >= 0; k++) {
15+
dp[i] = (dp[i] + dp[i-k])%MOD;
16+
}
17+
}
18+
printf("%d\n", dp[n]);
19+
return 0;
20+
}

CSES/Dynamic Programming/cses1634.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
const int N = 1e2+5, M = 1e6+5, OO = 0x3f3f3f3f;
8+
9+
int n, x;
10+
int A[N], dp[M];
11+
12+
int main() {
13+
scanf("%d %d", &n, &x);
14+
memset(dp, OO, sizeof dp);
15+
for (int i = 0; i < n; i++) {
16+
scanf("%d", A+i);
17+
}
18+
dp[0] = 0;
19+
for (int i = 1; i <= x; i++) {
20+
for (int k = 0; k < n; k++) {
21+
if (i >= A[k]) {
22+
dp[i] = min(dp[i], dp[i-A[k]] + 1);
23+
}
24+
}
25+
}
26+
printf("%d\n", dp[x] == OO ? -1 : dp[x]);
27+
return 0;
28+
}

CSES/Dynamic Programming/cses1635.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
const int N = 1e2+5, M = 1e6+5, OO = 0x3f3f3f3f, MOD = 1e9+7;
8+
9+
int n, x;
10+
int A[N], dp[M];
11+
12+
int main() {
13+
scanf("%d %d", &n, &x);
14+
for (int i = 0; i < n; i++) {
15+
scanf("%d", A+i);
16+
}
17+
dp[0] = 1;
18+
for (int i = 1; i <= x; i++) {
19+
for (int k = 0; k < n; k++) {
20+
if (i >= A[k]) {
21+
dp[i] = (dp[i] + dp[i - A[k]]) % MOD;
22+
}
23+
}
24+
}
25+
printf("%d\n", dp[x]);
26+
return 0;
27+
}

CSES/Dynamic Programming/cses1636.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <algorithm>
2+
#include <cstdio>
3+
#include <cstring>
4+
5+
using namespace std;
6+
7+
const int N = 1e2 + 5, M = 1e6 + 5, OO = 0x3f3f3f3f, MOD = 1e9 + 7;
8+
9+
int n, x;
10+
int A[N], dp[M];
11+
12+
int main() {
13+
scanf("%d %d", &n, &x);
14+
for (int i = 0; i < n; i++) {
15+
scanf("%d", A + i);
16+
}
17+
dp[0] = 1;
18+
for (int i = 0; i < n; i++) {
19+
for (int rem = A[i]; rem <= x; rem++) {
20+
dp[rem] += dp[rem - A[i]];
21+
if (dp[rem] >= MOD) {
22+
dp[rem] -= MOD;
23+
}
24+
}
25+
}
26+
printf("%d\n", dp[x]);
27+
return 0;
28+
}

CSES/Dynamic Programming/cses1637.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include <algorithm>
2+
#include <cstdio>
3+
#include <cstring>
4+
5+
using namespace std;
6+
7+
const int N = 1e6 + 5, OO = 0x3f3f3f3f, MOD = 1e9 + 7;
8+
9+
int n, cln, d;
10+
int dp[N];
11+
12+
int main() {
13+
scanf("%d", &n);
14+
fill(dp, dp+10, 1);
15+
for (int rem = 10; rem <= n; rem++) {
16+
cln = rem;
17+
dp[rem] = OO;
18+
while (cln) {
19+
d = cln % 10;
20+
cln /= 10;
21+
dp[rem] = min(dp[rem], dp[rem - d] + 1);
22+
}
23+
}
24+
printf("%d\n", dp[n]);
25+
return 0;
26+
}

CSES/Dynamic Programming/cses1638.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <cstdio>
2+
3+
using namespace std;
4+
5+
const int N = 1e3+3, MOD = 1e9+7;
6+
7+
int n;
8+
char A[N][N];
9+
int dp[N];
10+
11+
int main() {
12+
scanf("%d", &n);
13+
for (int r = 0; r < n; r++) {
14+
scanf("%s", A[r]);
15+
}
16+
dp[n-1] = (A[n-1][n-1] == '.');
17+
for (int r = n-1; ~r; r--) {
18+
for (int c = n-1; ~c; c--) {
19+
if (A[r][c] != '.') {
20+
dp[c] = 0;
21+
continue;
22+
}
23+
dp[c] = (dp[c] + dp[c+1]);
24+
if (dp[c] >= MOD) {
25+
dp[c] -= MOD;
26+
}
27+
}
28+
}
29+
printf("%d\n", dp[0]);
30+
return 0;
31+
}

0 commit comments

Comments
 (0)