题意:
给一个数组v,每次可以取前面的或者后面的,第k次取的v[i]价值为v[i]*k,问总价值最大是多少。
思路:
dp[i][j]代表从i-j的区间,先取i或者先取j得到的最大值
记忆化搜索代码:
#include<iostream>
#include<cmath>
using namespace std;
int dp[2010][2010],v[2010];
int dfs(int l,int r,int i){
if(l>r)return 0;
if(dp[l][r])return dp[l][r];
dp[l][r]=max(dfs(l+1,r,i+1)+v[l]*i,dfs(l,r-1,i+1)+v[r]*i);
// cout<<i<<" "<<l<<" "<<r<<" "<<dp[l][r]<<endl;
return dp[l][r];
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>v[i];
}
int ans=dfs(1,n,1);
cout<<ans<<endl;
}