結果
問題 | No.2591 安上がりな括弧列 |
ユーザー | srjywrdnprkt |
提出日時 | 2023-12-21 10:45:15 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 42 ms / 2,000 ms |
コード長 | 834 bytes |
コンパイル時間 | 2,490 ms |
コンパイル使用メモリ | 208,216 KB |
実行使用メモリ | 34,560 KB |
最終ジャッジ日時 | 2024-09-27 10:55:25 |
合計ジャッジ時間 | 3,538 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 23 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); ll N; string S; cin >> N >> S; N *= 2; S = "*"+S; vector<ll> A(N+1); for (int i=1; i<=N; i++) cin >> A[i]; vector dp(N+1, vector<ll>(N+1, 1e18)); dp[0][0] = 0; for (int i=1; i<=N; i++){ for (int j=0; j<=N; j++){ if (S[i] == '('){ if (j+1<=N) dp[i][j+1] = min(dp[i][j+1], dp[i-1][j]); if (j-1>=0) dp[i][j-1] = min(dp[i][j-1], dp[i-1][j]+A[i]); } else{ if (j-1>=0) dp[i][j-1] = min(dp[i][j-1], dp[i-1][j]); if (j+1<=N) dp[i][j+1] = min(dp[i][j+1], dp[i-1][j]+A[i]); } } } cout << dp[N][0] << endl; return 0; }