您的位置:首页 > 其它

HDU 3480 Division DP + 四边形优化

2014-09-15 20:25 399 查看
水题,证明有单调性之后直接照着拍就好

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>

using namespace std;

#define sq(x) ((x)*(x))

const int maxn = 10005;
const int maxm = 5005;
int f[maxn][maxm], s[maxn][maxm];
int val[maxn], n, m;

int main() {
int T; scanf("%d", &T);
for(int kase = 1;kase <= T;kase++) {
scanf("%d%d", &n, &m); m--;
for (int i = 1; i <= n; i++) scanf("%d", &val[i]);
sort(val + 1, val + 1 + n);
for (int i = 1; i <= n; i++) {
f[i][0] = sq(val[i] - val[1]);
int sj = min(m, i - 1);
s[i][sj + 1] = i - 1;
for (int j = sj; j >= 1;j--) {
f[i][j] = INT_MAX / 3;
for (int k = s[i - 1][j]; k <= s[i][j + 1]; k++) {
if (f[k][j - 1] + sq(val[i] - val[k + 1]) < f[i][j]) {
f[i][j] = f[k][j - 1] + sq(val[i] - val[k + 1]);
s[i][j] = k;
}
}
}
}
printf("Case %d: %d\n", kase, f
[m]);
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: