问题描述
n个正整数,两端的整数不能删除,其他的正整数可以删除,且其得分是本数同左右邻居相乘的结果,求除两端外的所有数删除后的最大得分。如 1 2 3,删除2后得分是6。
递归定义
dp[i][j] = dp[i][k] + dp[k][j] + a[i]*a[k]*a[j]
最优值:
dp[i][j] = max ( dp[i][j] , dp[i][k] + dp[k][j] + a[i]*a[k]*a[j] )
假设最后删掉第k个数得到的结果最大,总分是k左右两端的数之和与最后一次的得分相加。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int *a;//用来保存序列
int dp[100][100]={0};//dp[][]保存删除第i个数到第j个数得到的最优值
void dpf(int n){
int i=0,j=0,t=3,k=0;
for(t=3;t<=n;t++){
for(i=1;i<=n;i++){
j=i+t-1;
for(k=i+1;k<=j-1;k++){
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]*a[j]);
//cout<<dp[i][j]<<endl;
}
if(j>=n) break;
}
}
cout<<dp[1][n]<<endl;
}
int main(){
int n;
cin>>n;
a = new int[n+1];
for(int i = 1 ; i <= n ; i++)
cin>>a[i];
dpf(n);
delete []a;
return 0;
}
/*
6
1 5 3 4 6 2
*/