列表

详情


WY26. 回文序列

描述

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15}, {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51}, {112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。

输入描述

输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50) 第二行为序列中的n个整数item[i] (1 ≤ item[i] ≤ 1000),以空格分隔。

输出描述

输出一个数,表示最少需要的转换次数

示例1

输入:

4
1 1 1 3

输出:

2

说明:

经过第一次操作后,变为2 1 3,{2, 1, 3} 不是回文序列; 再经过一次操作后,变为3 3,{3, 3} 是回文序列; 所以共需要进行两次转换。

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2020-08-27

#include<stdio.h>
#include<string.h>
  
int main(){
    int n, i, count = 0;
    scanf("%d", &n);
    int num[n];
    for(i = 0; i < n; i++){
        scanf("%d", &num[i]);
    }
    int k, l;
    k = 0;
    l = n - 1;
    while(k < l){
        if(num[k] == num[l]){
            k ++;
            l --;
        }else if(num[k] < num[l]){
            num[k + 1] = num[k] + num[k + 1];
            ++k;
            ++count;
        }else{
            num[l - 1] = num[l -1] + num[l];
            --l;
            ++count;
        }
    }
    printf("%d", count);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 228KB, 提交时间: 2018-12-09

#include<stdio.h>
#include<string.h>

int main(){
    int n, i, count = 0;
    scanf("%d", &n);
    int num[n];
    for(i = 0; i < n; i++){
        scanf("%d", &num[i]);
    }
    int k, l;
    k = 0;
    l = n - 1;
    while(k < l){
        if(num[k] == num[l]){
            k ++;
            l --;
        }else if(num[k] < num[l]){
            num[k + 1] = num[k] + num[k + 1];
            ++k;
            ++count;
        }else{
            num[l - 1] = num[l -1] + num[l];
            --l;
            ++count;
        }
    }
    printf("%d", count);
    return 0;
}

上一题