小明买了神奇的石头,只有两个碰一碰

神奇的石头描述小明最近买从奶牛国买了一批神奇的石头,这些石头之间有一种神奇的现象,只要两个石头碰到了一起,就会消失。小明请木匠帮他打造了一个展览这些石头的展架,展架上从左往右挖了一排圆孔,用于放置石头,由于木匠的疏忽,在竣工之前一不小心若干个石头放在看展架的孔上,并且放置的位置有的不是很合理(但是不用担心相邻的孔里都有石头),会影响其他石头的放置,于是他就想找你帮他想想办法,如何在展架上放置尽可能多的石头(注意,你不能在相邻的两个孔同时放置石头),并且告诉他,有多少种方案,这个结果可能很大,请你输出结果对998877669取余的值day07-02.zip输入第一行一个整数n(n<=200000),表示孔的数量第二行,一个长度为n的01字符串,0表示这个位置是空的,1表示这个位置已经有石头了。输出一个整数,表示方案数输入样例 1 3010输出样例 11输入样例 2 510001输出样例 21

定义一个数组dp,其中dp[i]表示在第i个位置放置石头的方案数

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    
    string stones;
    cin >> stones;
    
    vector<int> dp(n+1, 0);
    dp[0] = 1; // 初始条件
    
    for (int i = 1; i <= n; i++) {
        if (stones[i-1] == '0') {
            if (i >= 2) {
                dp[i] = (dp[i-1] + dp[i-2]) % 998877669;
            } else {
                dp[i] = dp[i-1];
            }
        } else {
            dp[i] = dp[i-1];
        }
    }
    
    cout << dp[n] << endl;
    
    return 0;
}

【以下回答由 GPT 生成】

这个问题可以使用动态规划来解决。具体的解决方案如下:

  1. 定义一个长度为n的数组dp,用于记录每个位置上可以放置的石头的方案数。
  2. 初始化dp[0]=1,表示第一个位置可以放置一个石头的方案数为1。
  3. 遍历数组dp,对于每个位置i,计算dp[i]的值:
  4. 如果当前位置已经有石头(stones[i]=1),则dp[i]=0,表示这个位置不能放置石头。
  5. 如果当前位置是空的(stones[i]=0),则可以考虑把石头放在这个位置。此时,需要计算dp[i]的值。
  6. 注意到相邻的孔不能同时放置石头,所以需要考虑前一个位置的状态:
    • 如果第i-1个位置没有石头(stones[i-1]=0),则可以在这个位置放置石头,dp[i]=dp[i-1]。
    • 如果第i-1个位置已经有石头(stones[i-1]=1),则不能在这个位置放置石头,dp[i]=0。
    • 综上,dp[i]的值应该是dp[i-1](如果可以放置石头)或者0(如果不能放置石头)。
  7. 最后,对dp[i]进行取余运算,即dp[i] = dp[i] % 998877669。
  8. 遍历完数组dp后,dp[n-1]即为最终的方案数。
  9. 将dp[n-1]对998877669取余,得到最终的结果。

下面是对应的Python代码实现:

def maximize_stones(n, stones):
    dp = [0] * n
    dp[0] = 1
    for i in range(1, n):
        if stones[i] == "0":
            if stones[i-1] == "0":
                dp[i] = dp[i-1]
            else:
                dp[i] = 0
        dp[i] %= 998877669
    return dp[n-1]

n = int(input())
stones = input()
result = maximize_stones(n, stones)
print(result)

对于示例输入,该代码可以得到示例输出。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632