题目链接
题意
给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出 ∑ \sum ∑ vi的最大值。
思路
- dp[i][j]表示区间i到j可以取到的最大值
- dp[i][j]=max(dp[i+1][j]+aa[i]*bb[n-(j-i)],dp[i][j-1]+aa[j]*bb[n-(j-i)])
参考代码
#include<bits/stdc++.h>
using namespace std;
int aa[1010],bb[1010];
int dp[1010][1010];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>aa[i];
for(int i=1;i<=n;i++)
cin>>bb[i];
for(int i=1;i<=n;++i)
dp[i][i]=aa[i]*bb[n];
for(int i=n;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
{
dp[i][j]=max(dp[i+1][j]+aa[i]*bb[n-(j-i)],dp[i][j-1]+aa[j]*bb[n-(j-i)]);
}
}
cout<<dp[1][n]<<endl;
}
}