1A,我可真牛逼
1027-取数游戏2_2021秋季算法入门班第七章习题:动态规划1 (nowcoder.com)
题意:
思路:
一眼区间DP
状态设计:dp[l][r] 表示把区间[l,r]的数取完的最大价值
状态转移:
决策只有两种,头和尾,考虑这两种决策就行
然后取了多少数是已经确定的,就是:int t=n-(r-(l+1)+1);
边界搞不清楚就拿[1,n]套进去凑一凑就行了
Code:
#include <bits/stdc++.h>
using namespace std;
//#define int long long
const int mxn=1e3+10;
const int mxe=1e6+10;
int n;
int a[mxn],b[mxn];
int dp[mxn][mxn];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
memset(dp,-0x3f,sizeof(dp));
for(int len=1;len<=n;len++){
for(int l=1;l+len-1<=n;l++){
int r=l+len-1;
if(len==1) dp[l][r]=a[l]*b[n];
else{
int t=n-(r-(l+1)+1);
dp[l][r]=max(dp[l][r],max(dp[l+1][r]+b[t]*a[l],dp[l][r-1]+b[t]*a[r]));
}
}
}
cout<<dp[1][n]<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}