前言
近期本蒟蒻在备战第十四届蓝桥杯大赛江西省赛,在刷题中有所总结,想分享给大家
一、进制转换
#include <iostream>
#include <string>
using namespace std;
int main()
{
string st;
cin >> st;
cout << stoi(st, 0, 9);
return 0;
}
使用string库里面的stoi函数,将字符转换为十进制的字符。
使用示例
stoi(st, 0, 9); st 表示的是字符串,转换开始的位置,9表示由九进制转换为十进制
二、整数分解
题目:
将 3 分解成两个正整数的和,有两种分解方法,分别是 3 = 1 + 2 和 3 = 2 + 1。注意顺序不同算不同的方法。将 5 分解成三个正整数的和,有 6 种分解方法,它们是 1+1+3 = 1+2+2 = 1 + 3 + 1 = 2 + 1 + 2 = 2 + 2 + 1 = 3 + 1 + 1。请问,将 2021 分解成五个正整数的和,有多少种分解方法?
我没有想到这道题目可以用dp来做,当然也是可以用组合数学来做,组合数学更简单。
首先我们来将用dp来做
状态设计:dp[i][j]表示 i 分成 j 个正整数之和的方案数
初始状态:dp[i][1] = 1
转移方程:dp[i][j] = dp[k][j - 1] 其中k 是比i小的数
所求结果:dp[2021][5]
看到这你可能不太理解转移方程,其意思是当把i分成 j 个正整数之和时,其方案数等于 将 k (k比 i 小)分成 j - 1个正整数之和,还有一个正整数是 i - k,共j个正整数。
#include <iostream>
using namespace std;
long long dp[2022][6];
int main()
{
for(int i = 1; i <= 2021; i++)
dp[i][1] = 1;
for(int j = 1; j <= 2021; j++)
for(int k = 1; k < i; k++)
dp[i][j] += dp[k][j - 1];
cout << dp[2021][5];
return 0;
}
其次我们来说组合数学,这个题目相当于在2020个空隙之间插四个隔板,将其分成5个区域
ok ! 结束!
总结
stoi()函数用于将n进制转换为十进制,注意是将字符串转换为字符串。
可用dp来解决组合数学中的隔板问题。
最后是我对算法的感受,从去年10月份加入acm实验室第一次接触编程和算法,我被算法的思维与逻辑深深地吸引住了,但是因为自己并不是一个聪明的人和实验室比赛拉的太多,导致我没有很多时间去巩固所学的知识,我觉得我的数据结构,c++语法学的不好。现在我退出了acm算法实验室,很幸运加入了它对面的计算机应用实验室,计算机应用实验室给了我更多的时间去自主学习,也让我有一个良好的学习环境,在接下来的时间我会好好的去巩固我的数据结构,当然也会保留算法实验室的习惯,经常去刷题,相信时间的沉淀和自己的努力能让我的数据结构学的越来越好,除了算法,我也会去学些其他技术,后面也会和大家分享。
也分享一句我很喜欢的话:我喜欢田野,但我蠢笨,只能种荒十年,换得一时春生。
我的分享到此结束!!!!感谢观看!!!