啊啊啊啊孩子出息了我们是第一

非常常规的滚动数组优化,要说有什么心思的话就是发现输入小于1000果断采用int16

#include <iostream>
#include <sys/types.h>
using namespace std;

int main() {
    int n,i,j,t,curi,previ;
    cin>>n;
    unsigned int dp[2][n+1],result=0;
    u_int16_t nums[2][n];
    for(j=0;j<2;++j)for(i=0;i<n;++i){
        cin>>nums[j][i];
       // cout<<nums[j][i]<<' ';
    }
    dp[0][0]=0;
    for(i=0;i<=n;++i){
        curi=i%2;
        previ=!curi;
        for(j=i?0:1;j<n-i+1;++j){//注意区分,ij是个数,不是下标
            t=i+j;//代表取的个数
            dp[curi][j]=max(i?dp[previ][j]+nums[1][t-1]*nums[0][i-1]:0,j?dp[curi][j-1]+nums[1][t-1]*nums[0][n-j]:0);
            result=max(dp[curi][j],result);
            //cout<<i<<' '<<j<<' '<<result<<endl;
        }
    }
    cout<<result<<endl;
}
// 64 位输出请用 printf("%lld")