【NHOI2018】扑克游戏

【问题描述】
有一种别样“小猫钓鱼”扑克游戏。有 N 张牌,每张牌都有一个花色和点数。游戏的规则:扑克接龙时,若前面有同样花色的牌,你可以将这两张牌连同之间的牌都取走,得到的分值为取走牌点数之和。这里说的是可以,不是必须。给定扑克接龙的顺序,求最多的得分。
【输入格式】
第一行一个整数 N。
第二行 N 个整数,依次表示 1~N 张牌的花色。
第三行 N 个整数,依次表示 1~N 张牌的点数。
【输出格式】
一个整数,为游戏可以得到最大得分。
【输入样例】
7
1 2 1 2 3 2 3
1 4 3 4 3 4 5
【输出样例】
23
数据范围:1<=n<=3000
【解题思路】
简单的DP+利用前缀和求出数据中某一段的和。
【参考程序】

#include<iostream>
#include<cstdio>
using namespace std;
int n,c[3001],f[3001],dp[3001];
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d",&c[i]);
    for (int i=1;i<=n;i++) 
    {
        scanf("%d",&f[i]);
        f[i]=f[i-1]+f[i];
    }
    for (int i=1;i<=n;i++)
    {
        dp[i]=dp[i-1];
        for (int j=1;j<i;j++)
            if (c[i]==c[j])
                dp[i]=max(dp[i],dp[j-1]+f[i]-f[j-1]);
    }
    cout<<dp[n];
    return 0;
}
2018年NOI(全国青少年信息学奥林匹克竞赛)小甲虫第五题“拆除桥墩”通常涉及到动态规划或者搜索策略的问题。题目大意可能是给定一座有若干桥墩需要拆卸,每次操作可以选择拆除一个桥墩,并可能导致河流中某些部分水位上升。你需要计算出最小的操作次数,使得所有区域都保持在安全水位以下。 关于二分查找用于解决这个问题的C++代码示例,因为二分法通常适用于已知范围的搜索,而这里更可能是通过动态规划或搜索遍历找到最优解,所以直接套用二分查找并不合适。不过,如果题目允许使用二分搜索作为辅助优化,那么可以考虑先预处理每个桥墩所能覆盖的最大水位,然后用二分搜索在这些值中寻找最小操作数。 由于具体的代码依赖于问题的具体描述和细节,下面是一个简单的伪代码示例: ```cpp #include <vector> using namespace std; // 假设bridgeDams表示桥墩位置和高度 int maxWaterLevel(const vector<int>& bridgeDams) { // ... 动态规划或搜索算法计算最大覆盖水位 ... } bool canRemove(int mid, const vector<int>& bridgeDams, int safeLevel) { // ... 判断是否可以通过删除mid个桥墩保证所有区域水位低于safeLevel ... } int minOperations(vector<int>& bridgeDams, int safeLevel) { int left = 0; int right = bridgeDams.size(); while (left <= right) { int mid = (left + right) / 2; if (canRemove(mid, bridgeDams, safeLevel)) { right = mid - 1; // 如果当前中间数可行,缩小右边界 } else { left = mid + 1; // 否则,扩大左边界 } } return left; // 最终返回最小操作数 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值