793DPresents in Bankopolis

xiaoxiao2021-02-28  179

#include<iostream> #include<vector> #include<string> #include<set> #include<map> #include<algorithm> #include<queue> #include<list> #include<stack> #include<cstdio> #include<fstream> #include<numeric> #include<functional> #include<utility> #include<memory.h> using namespace std; using namespace placeholders; int area[82][82]; int dp[82][82][82][82]; int n, k, m; int Cal(int left, int right, int cur, int amount){ if (dp[left][right][cur][amount] != -1) return dp[left][right][cur][amount]; if (amount == 1){ dp[left][right][cur][amount] = 0; return 0; } int res = 1e8; for (int i = 1; i <= n; i++){ if (area[cur][i] <= 1000 && i>left&&i<right){ int l = left, r = right; if (cur < i) l = cur; else r = cur; res = min(res, area[cur][i] + Cal(l, r, i, amount - 1)); } } dp[left][right][cur][amount] = res; return res; } int main(){ while (cin >> n >> k){ cin >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) area[i][j] = 1e8; memset(dp, -1, sizeof(dp)); for (int i = 1; i <= m; i++){ int u, v, c; cin >> u >> v >> c; area[u][v] = min(area[u][v], c); } int ans = 1e8; for (int i = 1; i <= n; i++){ int left = 0; int right = n + 1; ans = min(ans, Cal(left, right, i, k)); } if (ans >= 1e8) cout << "-1" << endl; else cout << ans << endl; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-18273.html

最新回复(0)