参考了
2018秋招 搜狐 回文数组_C/C++_跳出舒适区-CSDN博客
思路:
找出正序和逆序中能子回文子串中总和最大的,因此需要填补的那些总和就是最小的。
一开始想用双数组做,失败,30%通过率。
#include <bits/stdc++.h>
using namespace std;
int main(){
int n = 0;
cin>>n;
vector<int> nums(n,0);
vector<int> rev_nums(n,0);
long long sum = 0;
for(int i=0;i<n;i++){
cin>>nums[i];
rev_nums[n-i-1] = nums[i];
sum += nums[i];
}
//cout<<"sum=="<<sum<<endl;
//得到两个数组分别是正序和逆序
vector<vector<int> > dp(n+1,vector<int>(n+1,0));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(nums[i-1]==rev_nums[j-1]){
dp[i][j] = dp[i-1][j-1]+nums[i-1];
}
else{
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
} //这样dp[n][n]就是内部最大回文子串的总和
cout<<2*sum-dp[n][n]<<endl;
return 0;
}