取数游戏

本文介绍了一种求解给定两个整数序列时如何通过特定规则取数以获得最大价值的问题。采用递归深度优先搜索算法实现,适用于解决序列长度不大于1000的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 题目描述:

    给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值。

  • 输入描述:

    第一行一个数T,表示有T组数据。
    对于每组数据,第一行一个整数n,
    接下来两行分别给出A数列与B数列。

  • 输出描述:

    每一组数据输出一行,最大的∑vi。

  • 示例:

    • 输入

    2
    2
    1 1000
    2 1
    5
    1 3 5 2 4
    1 2 3 4 5

  • 输出

    2001
    52

  • 说明

    对于第二个样例,
    第一次从左边取走a1,v1=a1⋅b1=1,
    第二次从左边取走a2,v2=a2⋅b2=6,
    第三次从右边取走a5,v3=a5⋅b3=12,
    第四次从右边取走a4,v4=a4⋅b4=8,
    第五次取走剩下的a3,v5=a3⋅b5=25。
    总价值∑vi=1+6+12+8+25=52

  • 备注:

    T≤10
    1≤n≤103
    1≤ai,bi≤103

  • 程序代码:(搜索)

     #include<iostream>
     #include<cstring>
     #include<algorithm>
     #include<set>
     #define N 1200
    using namespace std;
     int a[N];
            int b[N];
            int dp[N][N];
    int dfs(int l,int r,int t){
          if(l>r)  return 0;
          if(dp[l][r]) return dp[l][r];
          int temp=0;
          temp=max(temp,dfs(l,r-1,t+1)+a[r]*b[t]);
          temp=max(temp,dfs(l+1,r,t+1)+a[l]*b[t]);
    return dp[l][r]=temp;
    
    }
    int main(){
        int t;
        cin>>t;
        while(t--){
           memset(dp,0,sizeof(dp));
            int m;
            cin>>m;
            for(int i=0;i<m;i++)cin>>a[i];
            for(int i=0;i<m;i++)cin>>b[i];
            cout<<dfs(0,m-1,0)<<endl;
        }
       return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值