回文数组(搜狐编程)--python

来源:互联网 发布:剑灵热巴数据 编辑:程序博客网 时间:2024/04/30 01:21

题目描述:有一个数组正序和倒序相同,则这个数组被称为‘回文数组’。现在给定一个数组,要求对其进行插入数字,使其称为回文数组,求所有能实现方案中,使得最后回文数组和最小的方案,输出最终回文数组的和。

思路:求最大回文串,即求一个数组正序与倒序的最大公共串,并用一个二维数组dp进行记录和。注意判定条件,当s1[i]==s2[j]时,dp[i][j]=dp[i-1][j-1]+s1[i];否则dp[i][j]=max(dp[i-1][j],dp[i][j-1]),这两个判定将所有回文串的可能性都考虑进去了,那么最大回文串的和就是dp[-1][-1],那么结果就是2*sum(s1)-dp[-1][-1]

代码实现:

#-*-coding:utf-8-*-while True:    try:        n=int(raw_input())        s=map(int,raw_input().split())        s1=s[::-1]        dp=[[0 for i in range(n+1)] for j in range(n+1)]        for i in range(1,n+1):            for j in range(1,n+1):                if s[i-1]==s1[j-1]:                    dp[i][j]=dp[i-1][j-1]+s[i-1]                else:                    dp[i][j]=max(dp[i-1][j],dp[i][j-1])        ans=2*sum(s)-dp[n][n]        print ans    except:        break