一句话题意:N个数,首尾不相连。进行n-1次合并,规则为1.相邻2.合并后数值为两者大值 3.代价为该大数值 求最小代价 解 一 一个数列 如 2 3 1 4 5 在其中任选两个相邻的数值,其最小代价为二者取max 其余各数对选的这两个数所产生的影响只会有两种情况 1.增加代价 2.不变 二 现要证的是如何保证任意一组数据都有至少一种满足第一步的方案。如给定的 2 3 1 4 5 如相邻两两取max 则为 3 3 4 5 从小往大取,即可保证最优。 三 最后只需按顺序扫一遍即可 时间复杂度O(n)
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int tmp;
int N,x;
int Ans;
int main() {
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
scanf("%d%d",&N,&x);
long long Ans = 0;
for (int i = 1; i < N; ++ i) {
scanf("%d",&tmp);
Ans += max(x, tmp);
x = tmp;
}
printf("%lld\n", Ans);
fclose(stdin);
fclose(stdout);
}
浙公网安备 33010602011771号