【AcWing】递推(就是那种很棘手的题)

简介: 1208. 翻硬币 - AcWing题库

1208. 翻硬币 - AcWing题库

7.1.png

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int n;
char start[N], aim[N];
void turn(int i)
{
    if (start[i] == '*') start[i] = 'o';
    else start[i] = '*';
}
int main()
{
    cin >> start >> aim;
    n = strlen(start);
    int res = 0;
    for (int i = 0; i < n - 1; i ++ )
        if (start[i] != aim[i])
        {
            turn(i);//反转
            turn(i + 1);
            res ++ ;
        }
    cout << res << endl;
    return 0;
}

3777. 砖块 - AcWing题库

这个题,就是不看来源我就知道是cf的题(不要问我为什么)

7.2.png

🚥🚥🚥

注意翻硬币的过程,是从前往后递推

就是先变第1个,然后第2个,第3个,第4个......

🚥🚥🚥

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int n;
string str;
void update(char& c)//引用
{
    if (c == 'W') c = 'B';//更换颜色
    else c = 'W';
}
bool check(char c)
{
    vector<int> res;
    string s = str;
    for (int i = 0; i + 1 < n; i ++ )
    {
        if (s[i] != c)
        {
            update(s[i]);
            update(s[i + 1]);
            res.push_back(i);//存下这个操作,因为下面要输出
        }
    }
    if (s.back() != c) return false;//就是没有全部变为一个颜色
    cout << res.size() << endl;
    for (int x: res) cout << x + 1 << ' ';//因为题目中的下标从1开始
    if (res.size()) cout << endl;
    return true;
}
int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        cin >> n >> str;
        if (!check('B') && !check('W')) puts("-1");
        //判断能不能全部变为一个颜色
        //注意,check的返回类型为bool类型
    }
    return 0;
}

P1146 硬币翻转 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

7.3.png

翻n-1枚硬币,就是有一枚不翻,也可以理解为翻一枚

那么把所有的硬币都翻过来,操作次数=硬币个数

🚥🚥🚥

但是可不能这样子写,因为要输出具体的操作方法

image.png

代码

#include<iostream>
using namespace std;
const int maxn=101;
bool a[maxn];//a数组负责存储硬币的状态
int n;//n枚硬币
int main()
{
    cin>>n;
    cout<<n<<endl;//因为相当于只翻一枚,所以翻n次即可
    for(int i=1;i<=n;i++){//i表示这是第几次翻
        for(int j=1;j<=n;j++){//表示当前翻得是第几枚硬币
            if(j!=i){//如果不为第i枚(因为翻的是n-1枚)
                if(a[j])a[j]=0;//1变成0
                else a[j]=1;//0变成1
            }
            cout<<a[j];//输出当前状态
        }
        cout<<endl;//别忘了换行
    }
    return 0;
}

Code over!

相关文章
|
2月前
leetcode代码记录(动态规划基础题(斐波那契数列)
leetcode代码记录(动态规划基础题(斐波那契数列)
17 0
|
2月前
|
算法
动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】
动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】
|
2月前
|
人工智能 算法 索引
六六力扣刷题贪心算法之K次取反后最大化的数组和
六六力扣刷题贪心算法之K次取反后最大化的数组和
28 0
|
8月前
【动态规划入门】动态规划思路五部曲_斐波那契_爬楼梯_最小花费爬楼梯
【动态规划入门】动态规划思路五部曲_斐波那契_爬楼梯_最小花费爬楼梯
40 0
|
9月前
|
算法
[蓝桥杯] 递归与递推习题训练
蓝桥杯比赛只有四十天左右啦,最近会按照模块更新一些有关蓝桥杯算法题。学习算法不仅仅是为了参见比赛,更是以后找工作的一个敲门砖。废话不多说,我们直接看题。
47 0
|
机器学习/深度学习 缓存 机器人
从暴力递归到动态规划(2)小乖,你也在为转移方程而烦恼吗?
从暴力递归到动态规划(2)小乖,你也在为转移方程而烦恼吗?
|
算法
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
94 0
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
|
存储 算法 编译器
代码随想录刷题|动态规划理论基础 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯(上)
代码随想录刷题|动态规划理论基础 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
代码随想录刷题|动态规划理论基础 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯(上)
代码随想录刷题|动态规划理论基础 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯(下)
代码随想录刷题|动态规划理论基础 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
代码随想录刷题|动态规划理论基础 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯(下)
代码随想录刷题|贪心算法理论 LeetCode455.分发饼干 376. 摆动序列 53. 最大子序和
代码随想录刷题|贪心算法理论 LeetCode455.分发饼干 376. 摆动序列 53. 最大子序和
代码随想录刷题|贪心算法理论 LeetCode455.分发饼干 376. 摆动序列 53. 最大子序和