2020 Jan Bronze Problem 1 Word Processor: Difference between revisions
(Created page with "== Problem == == Solution == == Code == Category:Yearly_2019_2020 Category:Bronze") |
No edit summary |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== Problem == | == Official Problem Statement == | ||
== | [http://www.usaco.org/index.php?page=viewproblem2&cpid=987 Word Processor] | ||
== | Problem Statement: | ||
Given a text document of length N, you must determine the minimum number of keystrokes needed to type the document. | |||
Solution: | |||
The solution to this problem is to use a dynamic programming approach. We can create a two-dimensional array of size N+1 x N+1, where the first row and column represent the empty string. We then fill the array with the minimum number of keystrokes needed to type the substring from the beginning of the document to the character at position (i, j). | |||
For example, if the document is "abcdef", the array would look like this: | |||
| | | a | b | c | d | e | f | | |||
|---|---|---|---|---|---|---|---| | |||
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | | |||
| a | 0 | 0 | 1 | 2 | 3 | 4 | 5 | | |||
| b | 0 | 0 | 0 | 1 | 2 | 3 | 4 | | |||
| c | 0 | 0 | 0 | 0 | 1 | 2 | 3 | | |||
| d | 0 | 0 | 0 | 0 | 0 | 1 | 2 | | |||
| e | 0 | 0 | 0 | 0 | 0 | 0 | 1 | | |||
| f | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | |||
We then use the following recurrence relation to fill the array: | |||
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + 1) for all k in [i, j-1] | |||
where dp[i][j] is the minimum number of keystrokes needed to type the substring from the beginning of the document to the character at position (i, j). | |||
We can then use this array to determine the minimum number of keystrokes needed to type the entire document. The answer is dp[0][N], which is the value in the bottom right corner of the array. | |||
C++ Code: | |||
#include <bits/stdc++.h> | |||
using namespace std; | |||
int main() { | |||
int N; | |||
cin >> N; | |||
string s; | |||
cin >> s; | |||
int dp[N+1][N+1]; | |||
memset(dp, 0, sizeof(dp)); | |||
for (int i = 0; i < N; i++) { | |||
for (int j = i; j < N; j++) { | |||
dp[i][j] = j - i; | |||
for (int k = i; k < j; k++) { | |||
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + 1); | |||
} | |||
} | |||
} | |||
cout << dp[0][N] << endl; | |||
return 0; | |||
} | |||
[[Category:Yearly_2019_2020]] | [[Category:Yearly_2019_2020]] | ||
[[Category:Bronze]] | [[Category:Bronze]] | ||
[[Category:Simulation]] | |||
[[Category:String Manipulation]] | |||
[[Category:Greedy]] |
Latest revision as of 23:06, 11 June 2023
Official Problem Statement[edit]
Problem Statement:
Given a text document of length N, you must determine the minimum number of keystrokes needed to type the document.
Solution:
The solution to this problem is to use a dynamic programming approach. We can create a two-dimensional array of size N+1 x N+1, where the first row and column represent the empty string. We then fill the array with the minimum number of keystrokes needed to type the substring from the beginning of the document to the character at position (i, j).
For example, if the document is "abcdef", the array would look like this:
| | | a | b | c | d | e | f | |---|---|---|---|---|---|---|---| | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | | a | 0 | 0 | 1 | 2 | 3 | 4 | 5 | | b | 0 | 0 | 0 | 1 | 2 | 3 | 4 | | c | 0 | 0 | 0 | 0 | 1 | 2 | 3 | | d | 0 | 0 | 0 | 0 | 0 | 1 | 2 | | e | 0 | 0 | 0 | 0 | 0 | 0 | 1 | | f | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
We then use the following recurrence relation to fill the array:
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + 1) for all k in [i, j-1]
where dp[i][j] is the minimum number of keystrokes needed to type the substring from the beginning of the document to the character at position (i, j).
We can then use this array to determine the minimum number of keystrokes needed to type the entire document. The answer is dp[0][N], which is the value in the bottom right corner of the array.
C++ Code:
- include <bits/stdc++.h>
using namespace std;
int main() {
int N; cin >> N; string s; cin >> s; int dp[N+1][N+1]; memset(dp, 0, sizeof(dp)); for (int i = 0; i < N; i++) { for (int j = i; j < N; j++) { dp[i][j] = j - i; for (int k = i; k < j; k++) { dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + 1); } } } cout << dp[0][N] << endl; return 0;
}