列表

详情


SH10. 回文数组

描述

对于一个给定的正整数组成的数组 a[] ,如果将 a 倒序后数字的排列与 a 完全相同,我们称这个数组为“回文”的。
例如, [1, 2, 3, 2, 1] 的倒序是他自己,所以是一个回文的数组;而 [1, 2, 3, 1, 2] 的倒序是 [2, 1, 3, 2, 1] ,所以不是一个回文的数组。
对于任意一个正整数数组,如果我们向其中某些特定的位置插入一些正整数,那么我们总是能构造出一个回文的数组。

输入一个正整数组成的数组,要求你插入一些数字,使其变为回文的数组,且数组中所有数字的和尽可能小。输出这个插入后数组中元素的和。

例如,对于数组 [1, 2, 3, 1, 2] 我们可以插入两个 1 将其变为回文的数组 [1, 2, 1, 3, 1, 2, 1] ,这种变换方式数组的总和最小,为 11 ,所以输出为 11 。

输入描述

输入数据由两行组成: 第一行包含一个正整数 L ,表示数组 a 的长度。 第二行包含 L 个正整数,表示数组 a 。 对于 40% 的数据: 1 < L <= 100 达成条件时需要插入的数字数量不多于 2 个。 对于 100% 的数据: 1 < L <= 1,000 0 < a[i] <= 1,000,000 达成条件时需要插入的数字数量没有限制。

输出描述

输出一个整数,表示通过插入若干个正整数使数组 a 回文后,数组 a 的数字和的最小值。

示例1

输入:

8
51 23 52 97 97 76 23 51

输出:

598

原站题解

C++ 解法, 执行用时: 3ms, 内存消耗: 376KB, 提交时间: 2020-11-01

#include <algorithm>
#include <cstdio>
#include <numeric>
using namespace std;
const int N = 1005;
int solve();
   
//-----------INPUT-------------//
int n, nums[N];
   
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%d", nums + i);
    printf("%d\n", solve());
}
   
int forDp[2][N];
   
int solve() {
    int *dp = forDp[0], *dp1 = forDp[1];
    for (int i = n - 2; i >= 0; --i) {
        for (int j = i + 1; j < n; ++j) {
            if (nums[i] == nums[j]) dp[j] = dp1[j - 1];
            else dp[j] = min(nums[i] + dp1[j], nums[j] + dp[j - 1]);
        }
        swap(dp, dp1);
    }
    return dp1[n - 1] + accumulate(nums, nums + n, 0);
}

C++ 解法, 执行用时: 4ms, 内存消耗: 376KB, 提交时间: 2020-12-23

#include <algorithm>
#include <cstdio>
#include <numeric>
using namespace std;
const int N = 1005;
int solve();
   
//-----------INPUT-------------//
int n, nums[N];
   
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%d", nums + i);
    printf("%d\n", solve());
}
   
int forDp[2][N];
   
int solve() {
    int *dp = forDp[0], *dp1 = forDp[1];
    for (int i = n - 2; i >= 0; --i) {
        for (int j = i + 1; j < n; ++j) {
            if (nums[i] == nums[j]) dp[j] = dp1[j - 1];
            else dp[j] = min(nums[i] + dp1[j], nums[j] + dp[j - 1]);
        }
        swap(dp, dp1);
    }
    return dp1[n - 1] + accumulate(nums, nums + n, 0);
}

C++ 解法, 执行用时: 4ms, 内存消耗: 376KB, 提交时间: 2020-10-31

#include <algorithm>
#include <cstdio>
#include <numeric>
using namespace std;
const int N = 1005;
int solve();
   
//-----------INPUT-------------//
int n, nums[N];
   
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%d", nums + i);
    printf("%d\n", solve());
}
   
int forDp[2][N];
   
int solve() {
    int *dp = forDp[0], *dp1 = forDp[1];
    for (int i = n - 2; i >= 0; --i) {
        for (int j = i + 1; j < n; ++j) {
            if (nums[i] == nums[j]) dp[j] = dp1[j - 1];
            else dp[j] = min(nums[i] + dp1[j], nums[j] + dp[j - 1]);
        }
        swap(dp, dp1);
    }
    return dp1[n - 1] + accumulate(nums, nums + n, 0);
}

C++ 解法, 执行用时: 4ms, 内存消耗: 492KB, 提交时间: 2020-10-31

#include <algorithm>
#include <cstdio>
#include <numeric>
using namespace std;
const int N = 1005;
int solve();
   
//-----------INPUT-------------//
int n, nums[N];
   
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%d", nums + i);
    printf("%d\n", solve());
}
   
int forDp[2][N];
   
int solve() {
    int *dp = forDp[0], *dp1 = forDp[1];
    for (int i = n - 2; i >= 0; --i) {
        for (int j = i + 1; j < n; ++j) {
            if (nums[i] == nums[j]) dp[j] = dp1[j - 1];
            else dp[j] = min(nums[i] + dp1[j], nums[j] + dp[j - 1]);
        }
        swap(dp, dp1);
    }
    return dp1[n - 1] + accumulate(nums, nums + n, 0);
}

C++14 解法, 执行用时: 4ms, 内存消耗: 496KB, 提交时间: 2020-05-17

#include <algorithm>
#include <cstdio>
#include <numeric>
using namespace std;
const int N = 1005;
int solve();
  
//-----------INPUT-------------//
int n, nums[N];
  
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%d", nums + i);
    printf("%d\n", solve());
}
  
int forDp[2][N];
  
int solve() {
    int *dp = forDp[0], *dp1 = forDp[1];
    for (int i = n - 2; i >= 0; --i) {
        for (int j = i + 1; j < n; ++j) {
            if (nums[i] == nums[j]) dp[j] = dp1[j - 1];
            else dp[j] = min(nums[i] + dp1[j], nums[j] + dp[j - 1]);
        }
        swap(dp, dp1);
    }
    return dp1[n - 1] + accumulate(nums, nums + n, 0);
}

上一题