目前题解里面没有这样设置f数组的:
f [ i ] [ j ] 记录前 i 个里面交换 j 次得到的最小值
目前 WA on #4 #7 #9
#4 的测试点不大,如下:
in:
22
6 1
1 6
1 6
1 6
6 1
6 1
5 1
1 6
1 6
6 1
1 6
5 1
5 1
6 1
1 6
1 6
5 1
1 6
1 6
1 6
6 1
1 6
out:
5
#include<bits/stdc++.h>
using namespace std;
struct node {
int upper, lower;
int val1, val2;
};
int n;
vector<node> card;
vector<vector<int>> f, swapp;
void in() {
scanf("%d", &n);
card.resize(n + 1);
f.resize(n + 1, vector<int>(n + 1));
swapp.resize(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; ++i) {
scanf("%d%d", &card[i].upper, &card[i].lower);
card[i].val1 = card[i].upper - card[i].lower;
card[i].val2 = card[i].lower - card[i].upper;
}
return;
}
int dp() {
for (int i = 1; i <= n; ++i)
f[i][0] = f[i - 1][0] + card[i].val1;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) {
int f1 = f[i - 1][j] + card[i].val1;
int f2 = f[i - 1][j - 1] + card[i].val2;
f[i][j] = (abs(f1) <= abs(f2) ? f1 : f2);
if (abs(f2) < abs(f1))
swapp[i][j] = swapp[i - 1][j - 1] + 1;
else
swapp[i][j] = swapp[i - 1][j];
}
int ans, minor = 0x3f3f3f3f;
for (int i = 0; i <= n; ++i)
if (abs(f[n][i]) < minor)
ans = i, minor = abs(f[n][i]);
return ans;
}
int main() {
in();
cout << dp();
return 0;
}