题目描述:有一个数组正序和倒序相同,则这个数组被称为‘回文数组’。现在给定一个数组,要求对其进行插入数字,使其称为回文数组,求所有能实现方案中,使得最后回文数组和最小的方案,输出最终回文数组的和。
思路:求最大回文串,即求一个数组正序与倒序的最大公共串,并用一个二维数组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