啊啊啊啊孩子出息了我们是第一
非常常规的滚动数组优化,要说有什么心思的话就是发现输入小于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")

京公网安备 11010502036488号