9.4吉比特笔试情况 + 第三题代码

选择填空都有点耗时,编程第二题题意不清。
调查一下编程题AC情况。
第一题模拟。
第二题题意没懂。
第三题代码存了一下,写的记忆化搜索,其实本质上是区间dp,从小范围到大范围写就好了,一开始瞎写的搜索干脆就将错就错了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 105;
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
ll a[maxn],dp[maxn][maxn][2],sum[maxn],ans = -inf;
//0->A,1->B
int cnt = 0;
ll dfs(int l,int r,int op)
{
    if(l > r)
    {
        return 0;
    }
    ll tt = 0;
    if(op == 0 && dp[l][r][op] != -inf)
        return dp[l][r][op];
    else if(op == 1 && dp[l][r][op] != inf)
        return dp[l][r][op];
    ll mx = -inf,mi = inf;
    for(int i = l; i <= r; i++)
    {
        if(op)
            tt = -sum[i]+sum[l-1];
        else
            tt = sum[i]-sum[l-1];
        ll t = dfs(i+1,r,op^1);
        mx = max(mx,t+tt);
        mi = min(mi,t+tt);
    }
    for(int i = r; i >= l; i--)
    {
        if(op)
            tt = -sum[r]+sum[i-1];
        else
            tt = sum[r]-sum[i-1];
        ll t = dfs(l,i-1,op^1);
        mx = max(mx,t+tt);
        mi = min(mi,t+tt);
    }
    if(op == 0)
        dp[l][r][0] = max(dp[l][r][0],mx);
    else
        dp[l][r][1] = min(dp[l][r][1],mi);
    return dp[l][r][op];
}
int main()
{
    ios::sync_with_stdio(0);
    int n;
    cin>>n;
    for(int i = 1; i <= n; i++)
        cin>>a[i];
    for(int i = 1; i <= n; i++)
        sum[i] = sum[i-1]+a[i];
    for(int i = 1; i <= n; i++)
        for(int j = i; j <= n; j++)
            dp[i][j][0] = -inf,dp[i][j][1] = inf;
    cout<<dfs(1,n,0);
    return 0;
}




#笔试##吉比特##吉比特笔试##题解#
全部评论
第三题兄弟们可以参考lc的486题 基本上一摸一样 只是递归条件变了吉比特可以选择多个数
1 回复 分享
发布于 2022-09-04 21:34 美国
老哥能否问下 op是干嘛的
点赞 回复 分享
发布于 2022-09-05 11:46 浙江

相关推荐

像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
3
9
分享
牛客网
牛客企业服务