結果

問題 No.252 "良問"(良問とは言っていない (2)
ユーザー ふーらくたるふーらくたる
提出日時 2016-09-23 19:55:01
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 2,307 bytes
コンパイル時間 545 ms
コンパイル使用メモリ 58,472 KB
実行使用メモリ 394,976 KB
最終ジャッジ日時 2024-11-17 19:54:20
合計ジャッジ時間 3,831 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 WA -
testcase_02 AC 291 ms
81,748 KB
testcase_03 MLE -
testcase_04 MLE -
testcase_05 MLE -
testcase_06 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#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]);
                    }
                    dp[i + 1][0][0] = min(dp[i + 1][0][0],
                                          dp[i][g_len][p_len]);
                }
            }
        }
        cout << dp[s.size()][good.size()][problem.size()] << endl;
    }

    return 0;
}
0