Atcoder dp_c (https://atcoder.jp/contests/dp/tasks/dp_c) において以下のプログラムを書きました。再起関数でDPを行おうとしたのですが、Visual Studio でビルドを行うと、utility 33行目「2引数を取り込む関数には評価されません」と、エラーが出ます。chmax の使い方に問題があるのだと思いますが、utility ファイルを見てもよく分からなかったので、このエラーは何が原因で、どうすれば治るのかを教えてください。
utilityファイルの33行目前後
_STD_BEGIN // FUNCTION TEMPLATE max template <class _Ty, class _Pr> _NODISCARD constexpr const _Ty&(max)(const _Ty& _Left, const _Ty& _Right, _Pr _Pred) noexcept( noexcept(_Pred(_Left, _Right))) /* strengthened */ { // return larger of _Left and _Right return _Pred(_Left, _Right) ? _Right : _Left; }
コード
C++
1#include <bits/stdc++.h> 2#define _GLIBCXX_DEBUG 3#define rep(i, n) for (int i = 0; i < (int)(n); i++) 4#define rep2(i, s, n) for (int i = (s); i < (int)(n); i++) 5#define all(v) v.begin(), v.end() 6#define pb push_back 7#define sz(x) ((int)(x).size()) 8typedef long long ll; 9using namespace std; 10using Graph = vector<vector<int>>; 11template<class T>bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; } 12template<class T>bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; } 13const ll INF = 1LL << 60; 14 15int N; vector<ll> a, b, c; vector<vector<ll>> dp(3); 16 17ll rec(int x, int n) { 18 if (dp[x][n] != -1) return dp[x][n]; 19 20 ll res = 0; 21 22 if (x == 0) { 23 chmax(res, rec(1, n - 1) + a[n - 1]); 24 chmax(res, rec(2, n - 1) + a[n - 1]); 25 } 26 if (x == 1) { 27 chmax(res, rec(0, n - 1) + b[n - 1]); 28 chmax(res, rec(2, n - 1) + b[n - 1]); 29 } 30 if (x == 2) { 31 chmax(res, rec(0, n - 1) + c[n - 1]); 32 chmax(res, rec(1, n - 1) + c[n - 1]); 33 } 34 35 return dp[x][n] = res; 36} 37 38int main() { 39 cin.tie(0); 40 ios::sync_with_stdio(false); 41 42 cin >> N; a = b = c = vector<ll>(N); rep(i, N) cin >> a[i] >> b[i] >> c[i]; 43 44 dp = vector<vector<ll>>(3, vector<ll>(N + 1, -1)); dp[0] = { 0, 0, 0 }; 45 46 cout << max(rec(0, N), rec(1, N), rec(2, N)) << "\n"; 47 48 return 0; 49}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。