結果
| 問題 |
No.252 "良問"(良問とは言っていない (2)
|
| コンテスト | |
| ユーザー |
ふーらくたる
|
| 提出日時 | 2016-09-23 20:05:37 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,522 bytes |
| コンパイル時間 | 1,203 ms |
| コンパイル使用メモリ | 57,436 KB |
| 実行使用メモリ | 395,020 KB |
| 最終ジャッジ日時 | 2024-11-17 19:54:29 |
| 合計ジャッジ時間 | 3,195 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 1 WA * 3 MLE * 3 |
ソースコード
#include <iostream>
using namespace std;
const int SIZE = 1e6 + 10;
const int INF = (1 << 28);
int dp[SIZE][10][10]; // dp[i + 1][j][k] := s_iまで見ていてかつj文字目までg_lenが、k文字目までp_lenが作られているときの
// 最小コスト
int main() {
int t;
cin >> t;
string good = "good",
problem = "problem";
while (t--) {
string s;
cin >> s;
for (int i = 0; i <= s.size(); i++) {
for (int g_len = 0; g_len < 10; g_len++) {
for (int p_len = 0; p_len < 10; p_len++) {
dp[i][g_len][p_len] = INF;
}
}
}
dp[0][0][0] = 0;
for (int i = 0; i <= s.size(); i++) {
for (int g_len = 0; g_len <= good.size(); g_len++) {
for (int p_len = 0; p_len <= problem.size(); p_len++) {
// problemをすすめてよいとき
if (g_len == good.size()) {
dp[i + 1][g_len][p_len + 1] = min(dp[i + 1][g_len][p_len + 1],
dp[i][g_len][p_len] + (s[i] != problem[p_len]));
dp[i + 1][g_len][0] = min(dp[i + 1][g_len][0],
dp[i][g_len][p_len]);
}
// problemを破壊する
dp[i + 1][0][0] = min(dp[i + 1][0][0],
dp[i][g_len][p_len] + (s[i] == 'p'));
if (g_len < good.size()) {
dp[i + 1][g_len + 1][0] = min(dp[i + 1][g_len + 1][0],
dp[i][g_len][p_len] + (s[i] != good[g_len]));
}
if (g_len == good.size() && p_len == problem.size()) {
dp[i + 1][g_len][p_len] = min(dp[i + 1][g_len][p_len],
dp[i][g_len][p_len]);
}
if (p_len < problem.size()) {
dp[i + 1][0][0] = min(dp[i + 1][0][0],
dp[i][g_len][p_len] + (s[i] == problem[p_len]));
}
}
}
}
cout << dp[s.size()][good.size()][problem.size()] << endl;
/*
int x, y, z;
cin >> x >> y >> z;
cout << dp[x][y][z] << endl;
*/
}
return 0;
}
ふーらくたる