#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; struct Crystal { int y; int x; int c; Crystal(int y = -1, int x = -1, int c = -1) { this->y = y; this->x = x; this->c = c; } }; int main() { int GX, GY, N, F; cin >> GX >> GY >> N >> F; vector crystals; int x, y, c; for (int i = 0; i < N; ++i) { cin >> x >> y >> c; crystals.push_back(Crystal(y, x, c)); } int dp[N + 1][GY + 1][GX + 1]; memset(dp, -1, sizeof(dp)); for (int y = 0; y <= GY; ++y) { for (int x = 0; x <= GX; ++x) { int dist = y + x; dp[0][y][x] = F * dist; } } for (int i = 0; i < N; ++i) { Crystal crystal = crystals[i]; for (int y = 0; y <= GY; ++y) { for (int x = 0; x <= GX; ++x) { int ny = y + crystal.y; int nx = x + crystal.x; if (dp[i + 1][y][x] == -1) { dp[i + 1][y][x] = dp[i][y][x]; } else { dp[i + 1][y][x] = min(dp[i + 1][y][x], dp[i][y][x]); } if (0 <= ny && ny <= GY && 0 <= nx && nx <= GX) { if (dp[i + 1][ny][nx] == -1) { dp[i + 1][ny][nx] = dp[i][y][x] + crystal.c; } else { dp[i + 1][ny][nx] = min(dp[i + 1][ny][nx], dp[i][y][x] + crystal.c); } } if (y + 1 <= GY) { if (dp[i + 1][y + 1][x] == -1) { dp[i + 1][y + 1][x] = dp[i][y][x] + F; } else { dp[i + 1][y + 1][x] = min(dp[i + 1][y + 1][x], dp[i][y][x] + F); } } if (x + 1 <= GX) { if (dp[i + 1][y][x + 1] == -1) { dp[i + 1][y][x + 1] = dp[i][y][x] + F; } else { dp[i + 1][y][x + 1] = min(dp[i + 1][y][x + 1], dp[i][y][x] + F); } } } } } cout << dp[N][GY][GX] << endl; return 0; }