結果
| 問題 |
No.1916 Making Palindrome on Gird
|
| コンテスト | |
| ユーザー |
hiromi_ayase
|
| 提出日時 | 2022-04-30 02:53:20 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,005 bytes |
| コンパイル時間 | 13,107 ms |
| コンパイル使用メモリ | 397,672 KB |
| 実行使用メモリ | 35,072 KB |
| 最終ジャッジ日時 | 2024-06-29 08:55:30 |
| 合計ジャッジ時間 | 15,311 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 WA * 5 |
ソースコード
#[allow(clippy::many_single_char_names)]
fn main() {
let s = getline();
let a = s.split(' ').collect::<Vec<_>>();
let h = a[0].parse::<usize>().unwrap();
let w = a[1].parse::<usize>().unwrap();
let mut s = vec![vec!['a'; w]; h];
for i in 0..h {
s[i] = getline().chars().collect();
}
if s[0][0] != s[h - 1][w - 1] {
println!("0");
return;
}
let mut dp = vec![vec![vec![0; h]; w]; h];
dp[0][0][h - 1] = 1;
let v = (h + w - 1) / 2;
let m = 1_000_000_007;
for i in 0..h {
for j in 0..w {
if i + j >= v {
continue;
}
for ni in (0..h).rev() {
// i + j = (h-1-ni) + (w-1-nj)
let nj = w + h - (i + j) - 2 - ni;
if nj >= w || i > ni || j > nj {
continue;
}
if i + 1 < ni && s[i + 1][j] == s[ni - 1][nj] {
dp[i + 1][j][ni - 1] += dp[i][j][ni];
dp[i + 1][j][ni - 1] %= m;
}
if i < ni && j < nj && s[i + 1][j] == s[ni][nj - 1] {
dp[i + 1][j][ni] += dp[i][j][ni];
dp[i + 1][j][ni] %= m;
}
if i < ni && j < nj && s[i][j + 1] == s[ni - 1][nj] {
dp[i][j + 1][ni - 1] += dp[i][j][ni];
dp[i][j + 1][ni - 1] %= m;
}
if j + 1 < nj && s[i][j + 1] == s[ni][nj - 1] {
dp[i][j + 1][ni] += dp[i][j][ni];
dp[i][j + 1][ni] %= m;
}
}
}
}
let mut ans = 0;
for i in 0..h {
for j in 0..w {
if i + j == v {
ans += dp[i][j][i];
ans %= m;
}
}
}
println!("{}", ans);
}
fn getline() -> String {
let mut buf = String::new();
std::io::stdin().read_line(&mut buf).unwrap();
buf.trim().to_string()
}
hiromi_ayase