Kid Phantom 2024-06-14 13:30 采纳率: 45.5%
浏览 0

c++取数问题代码找错

题目描述
有n个数(2≤n≤100)排成一排,从n个数中任取若干个数,取数规则为每次取相邻的2个数,不能取1个,也不能取多于2个连续的数,找一种取法,使取到数的和为最大。
例如:n=6 6个数
13 2 17 14 8 16
其中和最大的为43
输入
第1行一个整数n,第2行n个整数
输出
一个整数,即合理取法中最大的和。
样例输入 Copy
6
12 7 8 14 9 13
样例输出 Copy
42

``#include<bits/stdc++.h>
#define MX 100
using namespace std;
int a[MX + 10] = {0};
int main()
{
    int n,i,j,k;
    long long ans = 0,ma = -1;
    cin >> n;
    for (i = 1;i <= n;i++)
    {
        cin >> a[i];
    }
    for (i = 1;i < n;i++)
    {
        ans = 0;
        ans += a[i] + a[i + 1];
        for (j = i + 3;j <= n;)
        {
            if (j >= n)
            {
                break;
            }
            int p = 0,q = 0,mx = -1;
            if (ans + a[j] + a[j + 1] > ans)
            {
                for (k = j;k < n;k++)
                {
                    mx = max(mx,a[k] + a[k + 1]);
                }
                for (k = j;k < n;k++)
                {
                    if (a[k] + a[k + 1] == mx)
                    {
                        p = k;
                        q = p + 1;
                    }
                }
                if (p - 2 <= j)//最大值和a[j] + a[j + 1]不相容 
                {
                    ans += mx;
                    j = q + 2;
                }
                else//相容,那么以后再取最大值也不迟 
                {
                    ans += a[j] + a[j + 1];
                    j += 3;
                } 
            }
            else
            {
                j++;
            }
        }
        ma = max(ma,ans);
    }
    cout << ma << endl;
    return 0;
}`

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-14 13:30
    关注

    引自免费微信小程序:皆我百晓生

    针对你提供的代码,确实存在一些逻辑上的问题,尤其是在尝试找到最大和时的处理方式。这里提供了一个优化后的代码实现,采用动态规划的方法来解决这个问题,这种方法可以确保在O(n)的时间复杂度内找到最优解。

    下面是修改后的代码,它遵循了动态规划的思想,通过构建一个数组dp来存储到当前位置为止的最大可能和,从而简化问题并避免了不必要的循环和条件检查。

    #include<bits/stdc++.h>
    using namespace std;
    
    const int MX = 100;
    
    long long dp[MX + 10] = {0};
    int a[MX + 10] = {0};
    
    int main() {
        int n;
        cin >> n;
        
        // Read the array
        for(int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        
        // Initialize dp array with base cases
        dp[1] = 0;
        dp[2] = a[1] + a[2];
        
        // Dynamic programming to find the maximum sum
        for(int i = 3; i <= n; i++) {
            dp[i] = max(dp[i-1], dp[i-2] + a[i-1] + a[i]);
            // Ensure that we take two numbers at a time and avoid taking three consecutive numbers
            if(i > 3) dp[i] = max(dp[i], dp[i-3] + a[i-1] + a[i]);
        }
        
        // Output the result
        cout << dp[n] << endl;
        
        return 0;
    }
    

    这个版本的代码首先读取输入的数字序列,然后初始化动态规划数组dp。对于每个位置idp[i]将存储包含前i个元素时的最大可能和。关键在于如何更新dp[i]的值:我们比较dp[i-1](即跳过当前两个数的情况)与dp[i-2] + a[i-1] + a[i](即选取当前两个数的情况),同时为了防止选取三个连续的数,还考虑了dp[i-3] + a[i-1] + a[i]的情况。这样,最终dp[n]将包含整个序列的最大可能和。

    这种方法简洁且高效,避免了原始代码中复杂的嵌套循环和条件判断,同时也保证了正确的结果。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月14日

悬赏问题

  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码
  • ¥15 AutoDL无法使用docker install吗?
  • ¥15 cups交叉编译后移植到tina sdk的t113,只需要实现usb驱动打印机,打印pdf文件
  • ¥30 关于#wireshark#的问题:需要网络应用流量数据集需要做长度序列的实验,需要与应用产生的会话的数据包的长度,如视频类或者聊天类软件
  • ¥15 根据上述描述表示泥浆密度沿着管路的长度方向在不断变化,如何来表示泥浆密度随管路的变化(标签-matlab|关键词-流计算)
  • ¥21 matlab可以把图像数据转换为小波分析吗
  • ¥60 基于香农编码的图像压缩算法实现
  • ¥15 matlabGUI绘制一个函数与其导数的图像
  • ¥20 大数据采集用Python爬取猫眼电影数据