取数游戏2----区间DP逆向四维

取数游戏2----区间DP逆向四维

题目链接

正向思维来想的话会发现a数组只能去第一个和最后一个很难找到状态如何转移,逆向来想,最后一个a元素可以是任何一个位置,倒是第二个是a的左边或者右边,理所应当想到用区间dp来写了
因为逆向,所以开始要乘以b[n]

状态转移方程:
i=j时即len=1
f[i][j]=b[n]*a[i]
否则
f[i][j]=max(f[i+1][j]+b[n-len+1] * a[i],f[i][j-1]+b[n-len+1] * a[j])

#include
#include
#include
#include
#include
using namespace std;
const int N=1010;
int a[N],b[N];
int f[N][N];
void solve()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    
    for(int len=1;len<=n;len++)
    {
        for(int i=1;i<=n;i++)
        {
            int j=i+len-1;
            if(i==j)f[i][j]=b[n]*a[i];
            else f[i][j]=max(f[i+1][j]+b[n-len+1]*a[i],f[i][j-1]+b[n-len+1]*a[j]);
        }
    }
    cout<<f[1][n]<<endl;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        solve();
    }
}

你可能感兴趣的:(DP,算法,动态规划,c++)