結果
問題 | No.20 砂漠のオアシス |
ユーザー |
|
提出日時 | 2022-05-10 21:33:18 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 26 ms / 5,000 ms |
コード長 | 1,420 bytes |
コンパイル時間 | 1,872 ms |
コンパイル使用メモリ | 183,228 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-18 04:23:49 |
合計ジャッジ時間 | 2,775 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
#include<bits/stdc++.h> using namespace std; int main(){ int N,V,OX,OY; cin >> N >> V >> OX >> OY; OX--; OY--; swap(OX,OY); vector<vector<int>> L(N,vector<int>(N)); for(int i=0;i<N;i++) for(int j=0;j<N;j++) cin >> L[i][j]; vector<vector<vector<int>>> dp(N,vector<vector<int>>(N,vector<int>(2,-1000000000))); dp[0][0][0] = V; vector<int> dx = {1,-1,0,0}; vector<int> dy = {0,0,1,-1}; priority_queue<pair<int,pair<pair<int,int>,int>>,vector<pair<int,pair<pair<int,int>,int>>>,less<pair<int,pair<pair<int,int>,int>>>> que; que.push(make_pair(V,make_pair(make_pair(0,0),0))); while(!que.empty()){ int x = que.top().second.first.first; int y = que.top().second.first.second; int o = que.top().second.second; int H = que.top().first; que.pop(); if(H < dp[x][y][o]) continue; for(int i=0;i<4;i++){ int nx = x+dx[i]; int ny = y+dy[i]; if(nx < 0 || nx >= N || ny < 0 || ny >= N) continue; if(H-L[nx][ny] <= 0) continue; int NH = H-L[nx][ny]; if(dp[nx][ny][o] < NH){ dp[nx][ny][o] = NH; que.push(make_pair(NH,make_pair(make_pair(nx,ny),o))); } if(o == 0 && OX == nx && OY == ny){ NH *= 2; dp[nx][ny][1] = NH; que.push(make_pair(NH,make_pair(make_pair(nx,ny),1))); } } } if(dp[N-1][N-1][0] > 0 || dp[N-1][N-1][1] > 0) cout << "YES" << endl; else cout << "NO" << endl; }