1 条题解

  • 2
    @ 2023-9-3 16:10:55

    这题可以用动态规划来解决:

    1、输入数据

    2、每次选取数都必须是本次选择的最优解,并且不能相邻,所以只能选第一项是f[i - 2]加上这一项的本身,第二项则是f[i - 1],这两者的最大值就是本次的最优选取方案,由此可推出动态转移方程为f[i] = max(f[i - 2] + a[i], f[i - 1])

    3、输出数据

    AC Code:

    #include <bits/stdc++.h>
    using namespace std;
    int n, f[55], a[55]; // 定义n、a数组和动态数组f
    int main()
    {
        ios::sync_with_stdio(false); // 读入加速
        cin.tie(0);
        cout.tie(0);
        cin >> n; // 输入n
        for (int i = 1; i <= n; i++)
            cin >> a[i]; // 输入数字
        f[1] = a[1]; // 由于是第一项,只有一个选择方案,所以只能选a[1];
        f[2] = max(a[1], a[2]); // 这里有了两个选项,所以这里得选最优的选数方案
        for (int i = 3; i <= n; i++)
            f[i] = max(f[i - 2] + a[i], f[i - 1]); // 动态规划
        cout << f[n]; // 由于每次都是最优解,所以最后一次就是整体最优解
        return 0;
    }
    

    本蒟蒻在这弱弱的求个赞

    • @ 2023-10-21 10:09:33

      动态转移方程无误,相比暴力算法也快了许多

  • 1

信息

ID
418
时间
1000ms
内存
16MiB
难度
3
标签
递交数
27
已通过
19
上传者