robin1111888 2023-05-14 20:49 采纳率: 50%
浏览 28
已结题

牛客,选择23976

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

想问问大家我的解题哪里错了啊,我的思路是:对于每一组求每个数与他后面最大数的和,然后将这些和比较选最大的输出


#include<bits/stdc++.h>
using namespace std;
const int N=105;
int a[N];
int main()
{
    int T;
    cin>>T;
    while(T)
    {
        T--;
        int n,m,ans=0;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        for(int i=0;i<n;i++)
        {m=0;
            for(int j=i+2;j<n;j++)
               if(m<a[j]) m=a[j];
            ans=max(ans,a[i]+m);
        }
        cout<<ans<<"\n";
    }
    return 0;
}

  • 写回答

1条回答 默认 最新

  • Dummer25 2023-05-14 21:41
    关注

    思路是对的,但是在计算后面最大数的时候存在一些问题。具体来说,题目要求选出的数不能相邻,而你在计算后面最大数的时候没有考虑到这一点,直接取了后面未选的最大数,可能会导致后面选了不合法的数。

    一个正确的方法是记录两个状态,即当前位置选和不选能获得的最大值,然后向后推进时分别计算选和不选的情况下能获得的最大值,并更新这两个状态。最终的答案为所有位置选和不选能获得的最大值中的较大值。

    修改代码如下:

    
    #include<bits/stdc++.h>
    using namespace std;
    const int N=105;
    int a[N];
    int f[N][2]; //f[i][0/1]表示考虑到第i个位置时,不选/选第i个位置能获得的最大值
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            int n, ans = 0;
            cin>>n;
            for(int i=1; i<=n; i++) {
                cin>>a[i];
            }
            memset(f, 0, sizeof(f)); //初始化
            f[1][0] = 0; f[1][1] = a[1];
            for(int i=2; i<=n; i++) {
                f[i][0] = max(f[i-1][0], f[i-1][1]); //不选第i个位置
                f[i][1] = f[i-1][0] + a[i]; //选第i个位置
            }
            ans = max(f[n][0], f[n][1]); //取较大值作为答案
            cout << ans << endl;
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月2日
  • 已采纳回答 5月25日
  • 创建了问题 5月14日

悬赏问题

  • ¥30 使用matlab将观测点聚合成多条目标轨迹
  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析