题目链接:点击打开链接
动态规划:dp[i][j]第i次取数右边的取j次的最大值
dp[i][j]=max(dp[i-1][j-1]+b[i]*a[n-j+1],dp[i-1][j]+b[i]*a[i-j])
dp[1][0]=a[1]*b[1];
dp[1][1]=a[n]*b[1];
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int dp[1010];
int main()
{
int t,n,i,j;
int a[1010],b[1010];
cin>>t;
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
cin>>b[i];
memset(dp,0,sizeof(dp));
dp[0]=a[1]*b[1];
dp[1]=a[n]*b[1];
for(i=2;i<=n;i++)
{
for(j=i;j>=0;j--)
{
dp[j]=max(dp[j-1]+b[i]*a[n-j+1],dp[j]+b[i]*a[i-j]);
}
}
int mx=0;
for(i=0;i<=n;i++)
mx=max(mx,dp[i]);
cout<<mx<<endl;
}
}
第i次取数只与i-1次有关,可以化成一维的
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int dp[1010];
int main()
{
int t,n,i,j;
int a[1010],b[1010];
cin>>t;
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
cin>>b[i];
memset(dp,0,sizeof(dp));
dp[0]=a[1]*b[1];
dp[1]=a[n]*b[1];
for(i=2;i<=n;i++)
{
for(j=i;j>=0;j--)
{
dp[j]=max(dp[j-1]+b[i]*a[n-j+1],dp[j]+b[i]*a[i-j]);
}
}
int mx=0;
for(i=0;i<=n;i++)
mx=max(mx,dp[i]);
cout<<mx<<endl;
}
}