結果
| 問題 |
No.1916 Making Palindrome on Gird
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-05-16 09:40:42 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,773 bytes |
| コンパイル時間 | 1,271 ms |
| コンパイル使用メモリ | 83,928 KB |
| 実行使用メモリ | 817,664 KB |
| 最終ジャッジ日時 | 2025-05-16 09:40:46 |
| 合計ジャッジ時間 | 4,189 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 WA * 2 |
| other | AC * 6 WA * 4 MLE * 1 -- * 19 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int MOD = 1000000007;
int main() {
// Read input
int H, W;
cin >> H >> W;
vector<vector<char>> grid(H+1, vector<char>(W+1));
for (int i = 1; i <= H; i++) {
for (int j = 1; j <= W; j++) {
cin >> grid[i][j];
}
}
// Create 4D DP array
// dp[i1][j1][i2][j2] = number of valid paths from (i1,j1) to (i2,j2)
// We'll use a more memory-efficient approach with a custom index
int M = max(H, W);
vector<vector<vector<vector<int>>>> dp(H+1, vector<vector<vector<int>>>(W+1,
vector<vector<int>>(H+1, vector<int>(W+1, 0))));
// Base cases: single point paths
for (int i = 1; i <= H; i++) {
for (int j = 1; j <= W; j++) {
dp[i][j][i][j] = 1;
}
}
// Base cases: adjacent positions with matching characters
for (int i = 1; i < H; i++) {
for (int j = 1; j <= W; j++) {
if (grid[i][j] == grid[i+1][j]) {
dp[i][j][i+1][j] = 1;
}
}
}
for (int i = 1; i <= H; i++) {
for (int j = 1; j < W; j++) {
if (grid[i][j] == grid[i][j+1]) {
dp[i][j][i][j+1] = 1;
}
}
}
// Fill the DP table using the optimized approach
// Process in order of increasing distance between (i1,j1) and (i2,j2)
for (int len = 3; len <= H + W - 1; len++) {
for (int i1 = 1; i1 <= H; i1++) {
for (int j1 = 1; j1 <= W; j1++) {
for (int i2 = i1; i2 <= H; i2++) {
// Calculate j2 based on the constraint that (i1,j1) and (i2,j2)
// are at distance len-2 (excluding the endpoints)
int j2 = len - (i2 - i1) - 1 + j1;
if (j2 < j1 || j2 > W) continue;
// Skip if characters don't match
if (grid[i1][j1] != grid[i2][j2]) continue;
// Apply the transition formula
if (i1 < i2 && j1 < j2) {
dp[i1][j1][i2][j2] = (
(i1+1 <= i2-1 ? dp[i1+1][j1][i2-1][j2] : 0) +
(j2-1 >= j1 ? dp[i1+1][j1][i2][j2-1] : 0) +
(i2-1 >= i1 ? dp[i1][j1+1][i2-1][j2] : 0) +
(j2-1 >= j1+1 ? dp[i1][j1+1][i2][j2-1] : 0)
) % MOD;
}
}
}
}
}
// The answer is the number of valid paths from (1,1) to (H,W)
cout << dp[1][1][H][W] << endl;
return 0;
}