dp[j][k]用于表示j到k的闭区间,然后逆向扩展区间,从最后一次取数一直扩展到第一次取数。
第一次取数的位置一定为最左或最右,即dp[1][n]=max(dp[2][n]+取数,dp[1][n-1]+取数)。
问题得到解决。
#include <bits/stdc++.h> using namespace std; #define ll long long ll dp[1050][1050]; ll a[1050]; ll b[1050]; int main() { int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } for(int i=1;i<=n;i++) { scanf("%lld",&b[i]); } for(int i=1;i<=n;i++) { for(int j=1;i+j-1<=n;j++) { int k=i+j-1; dp[j][k]=max(dp[j][k],max(dp[j][k-1]+a[k]*b[n-i+1],dp[j+1][k]+a[j]*b[n-i+1])); } } printf("%lld\n",dp[1][n]); } }