#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define mp make_pair #define pb push_back #define all(x) (x).begin(),(x).end() #define YES() printf("YES\n") #define NO() printf("NO\n") using namespace std; #define int long long //typedef long long ll; typedef unsigned long long ull; typedef vector vb; typedef vector vi; typedef vector vvb; typedef vector vvi; //typedef pair P; const int INF=1e+9; const double EPS=1e-9; const int dx[]={1,0,-1,0},dy[]={0,-1,0,1}; struct edge{ int tox,toy,cost; }; typedef pair POS; typedef pair P; signed main(){ int gx,gy,n,f; vector G[101][101]; int d[101][101]; cin >> gx >> gy >> n >> f; for(int i = 0;i < n;i++){ int x,y,c; cin >> x >> y >> c; for(int j = 0;j <= gx - x;j++){ for(int k = 0;k <= gy - y;k++) G[j][k].push_back({j + x,k + y,c}); } } for(int i = 0;i <= gx;i++){ for(int j = 0;j <= gy;j++) { if(i != gx) G[i][j].push_back({i + 1,j,f}); if(j != gy) G[i][j].push_back({i,j + 1,f}); } } for(int i = 0;i <= gx;i++){ for(int j = 0;j <= gy;j++) { d[i][j] = INF; } } d[0][0] = 0; priority_queue,greater

> que; que.push(mp(0,mp(0,0))); while(!que.empty()){ P p = que.top();que.pop(); int cost = p.first,x = p.second.first,y = p.second.second; if(d[x][y] < cost) continue; for(int i = 0;i < G[x][y].size();i++){ edge e = G[x][y][i]; if(d[e.tox][e.toy] > d[x][y] + e.cost){ d[e.tox][e.toy] = d[x][y] + e.cost; que.push(mp(d[e.tox][e.toy],mp(e.tox,e.toy))); } } } cout << d[gx][gy] << endl; return 0; }