码风良好 简单dp 求调玄关
查看原帖
码风良好 简单dp 求调玄关
1401594
Firsry楼主2025/1/25 19:46

目前题解里面没有这样设置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;
}
2025/1/25 19:46
加载中...