取数游戏2

取数游戏2

https://ac.nowcoder.com/acm/problem/14701

这个题做的时候发生了一个很搞笑的事情,就是如果你把代码里面的

int a[1011],b[1011];
int dp[1011][1011];

调换一下位置,哈,你就会惊喜的发现,段错误。
仅限c++11
题解:dp[i][j]代表着左边取i个数右边取j个数能获得的最大值。
当i+j==n的时候,就可以获得最大值了。
递推式:dp[i][j]=max(dp[i-1][j]+a[i]* b[i+j],dp[i][j-1]+a[n-j+1]*b[i+j]);

/*Keep on going Never give up*/
#include<bits/stdc++.h>
using namespace std;

int a[1011],b[1011];
int dp[1011][1011];

int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) cin>>b[i];
        for(int i=1;i<=n;i++){
            dp[i][0]=dp[i-1][0]+a[i]*b[i];
            dp[0][i]=dp[0][i-1]+a[n-i+1]*b[i];
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                dp[i][j]=max(dp[i-1][j]+a[i]*b[i+j],dp[i][j-1]+a[n-j+1]*b[i+j]);
                if(i+j==n) ans=max(ans,dp[i][j]);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
题解 文章被收录于专栏

主要写一些题目的题解

全部评论
大佬,这是为啥啊,交换位置就段错误了
点赞 回复 分享
发布于 2021-05-16 17:06
学习了
点赞 回复 分享
发布于 2021-12-03 20:53

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
评论
6
收藏
分享
牛客网
牛客企业服务