題目:
分析:
显然,还是一个区间dp问题。然后直接记忆化的dp,结果又超时了,加法可以用前缀和来优化,乘法显然不可以,只能从dp实现上考虑如何优化。
代码1:T了:
class Solution {
public:
int f(int x,int y,int c,vector<vector<int> > vv,vector<int> v,vector<int>& nums)
{
if(c==v.size()) return 0;
if(vv[x][y]!=-1) return vv[x][y];
if(x==y) {
return v[c]*nums[x];
}
vv[x][y]=max(f(x+1,y,c+1,vv,v,nums)+v[c]*nums[x],f(x,y-1,c+1,vv,v,nums)+v[c]*nums[y]);
return vv[x][y];
}
int maximumScore(vector<int>& nums, vector<int>& m) {
vector<int> v(nums.size(),-1);
vector<vector<int> > vv(nums.size(),v);
return f(0,nums.size()-1,0,vv,m,nums);
}
};
代码:
class Solution {
public:
int maximumScore(vector<int>& nums, vector<int>& m) {
vector<int> v(m.size()+1,0);
vector<vector<int> > vv(m.size()+1,v);
//初始化
for(int i=1;i<=m.size();i++) vv[i][0]=vv[i-1][0]+m[i-1]*nums[i-1];
for(int i=1;i<=m.size();i++) vv[0][i]=vv[0][i-1]+m[i-1]*nums[nums.size()-i];
//dp
for(int i=1;i<=m.size();i++)
for(int j=1;j<=m.size()-i;j++)
vv[i][j]=max(vv[i-1][j]+m[i+j-1]*nums[i-1],vv[i][j-1]+m[i+j-1]*nums[nums.size()-j]);
int ans=-(1<<30);
for(int i=0;i<=m.size();i++)
ans=max(ans,vv[i][m.size()-i]);
return ans;
}
};