1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int MAXN = 500; const int INF = 2147483647; int n; int a[MAXN + 5]; // f[l][r]: 把 l~r 这些牌合并好的最小代价 int f[MAXN + 5][MAXN + 5]; // pos[i]:i 这张牌在哪儿 int pos[MAXN + 5]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { int x; cin >> x; pos[x] = i; // x 这张牌在 i 号位置 } for (int len = 1; len <= n; len++) { for (int l = 1; l + len - 1 <= n; l++) { int r = l + len - 1; if (len == 1) f[l][r] = 0; else { f[l][r] = INF; for (int i = l; i <= r - 1; i++) { // 只能小的往大的放,所以两摞牌的位置恰好是两摞牌最大值的位置 f[l][r] = min(f[l][r], f[l][i] + f[i + 1][r] + len * abs(pos[i] - pos[r])); } } } } cout << f[1][n] << "\n"; return 0; }
- 1
信息
- ID
- 13400
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 11
- 已通过
- 11
- 上传者