NOIP20002. 题题 1.1. 进制转换进制转换
问题描述问题描述
设计一个程序,读入一个十进制数的基数设计一个程序,读入一个十进制数的基数
和一个负进制数的基数,并将此十进制数和一个负进制数的基数,并将此十进制数
转换为此负进制下的数:转换为此负进制下的数: -R {-2∈-R {-2∈ ,, -3-3 ,, --
4,....-20}4,....-20}
样例:样例:
输入输入 -15{-15{ 十进制下数十进制下数 } -2{} -2{ 转化为转化为 -R-R 进制进制 }}
输出输出 110001 (base -2)110001 (base -2)
3. 如何将十进制整数转换为如何将十进制整数转换为 -2-2
进制整数?进制整数?
采用“除采用“除 -2-2 取余,逆序排列”取余,逆序排列”
法法
具体做法:具体做法:
-2|-15 +-----..1
-2|8
+-----...0
-2|-4
+-----...0
-2|2
+-----...0
-2|-1
+-----...1
-2|1
+-----...1
0
结论:
1 、当 a 为非负数时, a
整除 b 结果为 a div b 。
2 、当 a 为负数时, a 整
除 b 结果为 a div b + 1 。
3 、余数 = 被除数 - 商 *
( -R )
5. 题题 2.2. 乘积最大乘积最大
问题转述:问题转述:
给出一个长度给出一个长度 NN (( 6<=N<=406<=N<=40 )的数字串,要)的数字串,要
求使用求使用 KK (( 1<=K<=61<=K<=6 )个乘号将它分成)个乘号将它分成 K+1K+1
个部分,找出一种分法,使得这个部分,找出一种分法,使得这 K+1K+1 个部分的个部分的
乘积能够为最大。乘积能够为最大。
样例样例 ::
输入输入
4 24 2
12311231
输出输出
6262
6. 算法分析:算法分析:
11 、、 4040 位数字插入位数字插入 66 个乘号,需要使用个乘号,需要使用
高精度。高精度。
22 、数据规模大,搜索无法满足,使用动、数据规模大,搜索无法满足,使用动
态规划。态规划。
如何进行动态规划?
7. 样例分析样例分析
1*23=231*23=23
12*3=36 max=3612*3=36 max=36
我们把第我们把第 ii 位数上,插入位数上,插入 KK 个乘号的状态个乘号的状态
表示为表示为 FF 【【 ii ,, kk 】,显然】,显然
FF 【【 ii ,, kk 】】 =max{F[1,k-1]*s[2,i],F[2,k-=max{F[1,k-1]*s[2,i],F[2,k-
1]*s[3,i],…,f[i-1,k-1]*s[i]}1]*s[3,i],…,f[i-1,k-1]*s[i]}
输入: 3 1
123
转移方程为:
f[i,k]=Max{f[j,k-1]*s[j+1,i]} (j<i)
f[i,k] 表示从第一位到第 i 位的数字串中填入 k
个乘号所得到的最大乘积;
s[i,j] 表示从第 i 位到第 j 位所组成的数字。
通过状态转移方程推出所有状态的最优值,最
后 f[n,k] 即为答案
8. 题目小结题目小结
11 、简单的动态规划、简单的动态规划
22 、加入高精度乘法,注意编写程序时各、加入高精度乘法,注意编写程序时各
部分的联系部分的联系
33 、因为填入第、因为填入第 kk 个乘号只与含有个乘号只与含有 k-1k-1 个个
乘号的算式有关,所以可以用乘号的算式有关,所以可以用滚动数组滚动数组解解
决,空间复杂度从决,空间复杂度从 O(n*k)O(n*k) 降为降为 O(n)O(n) 。。
44 、数据小,其实不加入高精度也可以、数据小,其实不加入高精度也可以
ACAC ,使用,使用 int64int64 (( 2020 位整数)位整数)
9. 题题 33 、单词接龙、单词接龙
题目转述:题目转述:
给出给出 NN 个单词及开头字母个单词及开头字母 XX ,求出长度最,求出长度最
长的接龙的长度。其中,每个单词至多出长的接龙的长度。其中,每个单词至多出
现两次,在两个单词相连时,其重合部分现两次,在两个单词相连时,其重合部分
合为一部分,例如合为一部分,例如 beastbeast 和和 astonishastonish ,如,如
果接成一条龙则变为果接成一条龙则变为 beastonishbeastonish ,另外相,另外相
邻的两部分不能存在包含关系,例如邻的两部分不能存在包含关系,例如 atat 和和
atideatide 间不能相连。间不能相连。
12. 注意!注意!
有两点要注意,题上说的很不明确,容易有两点要注意,题上说的很不明确,容易
造成误解。造成误解。
11 、所谓“两部分不能存在包含关系”,是、所谓“两部分不能存在包含关系”,是
指两部分接龙后不能长度不增加。例如指两部分接龙后不能长度不增加。例如
abababababab 和和 abababababab ,可以接成,可以接成
abababababababababab ,但不能为,但不能为 abababababab 。。
22 、接龙时,如果两个单词接龙后的单词、接龙时,如果两个单词接龙后的单词
有多种情况,要尽可能保证接龙后的单词有多种情况,要尽可能保证接龙后的单词
最长。例如最长。例如 cababcabab 和和 ababcababc ,,一定要接一定要接
成成 cabababccabababc ,为而不是,为而不是 cababccababc 。。
13. 题题 4.4. 方格取数方格取数
问题转述:问题转述:
给出给出 N*NN*N 方格图,某些方格中有方格图,某些方格中有
正整数,剩余的其它方格中的数字正整数,剩余的其它方格中的数字
为零。从图的左上角的为零。从图的左上角的 AA 点出发,点出发,
可以向下行走,也可以向右走,直可以向下行走,也可以向右走,直
到到达右下角的到到达右下角的 BB 点。在走过的点。在走过的
路上,可以取走方格中的数(取走路上,可以取走方格中的数(取走
后的方格中将变为数字后的方格中将变为数字 00 )。从)。从 AA
点到点到 BB 点共走两次,试找出点共走两次,试找出 22 条这条这
样的路径,使得取得的数之和为最样的路径,使得取得的数之和为最
大。大。
14. 分析:分析:
显然,贪心算法是不能解决该题的,显然,贪心算法是不能解决该题的,
由“由“ N≤8”N≤8” 可以很自然地想到搜索。但是题可以很自然地想到搜索。但是题
目要求走两条路径,这样搜索便会超时。目要求走两条路径,这样搜索便会超时。
如果题目要求只走一条路,那么除了搜索如果题目要求只走一条路,那么除了搜索
之外,还有一种很容易想到的方法就是动之外,还有一种很容易想到的方法就是动
态规划。将动态规划运用到解两条路径的态规划。将动态规划运用到解两条路径的
问题:因为走过的方格内的数字是要清零问题:因为走过的方格内的数字是要清零
的,就需要特别处理两条路相交的部分,的,就需要特别处理两条路相交的部分,
似乎比较麻烦。那么该怎么办呢?似乎比较麻烦。那么该怎么办呢?
18. 双线程双线程 DPDP
For x:=3 To m+n Do
For i:=1 To Min(x,n) Do
For j:=1 To Min(x,n) Do
Begin
f[x,i,j]:=Max(f[x-1,i,j],f[x-1,i-1,j],f[x-1,i,j-1],f[x-1,i-1,j-1]);
If i=j Then Inc(f[x,i,j],a[i,x-i])
Else Begin
Inc(f[x,i,j],a[x-i,i]);
Inc(f[x,i,j],a[x-j,j]);
End;
End;
同样的,三取方格数只要求
f[x,i,j,k] ,用同样的方法即可。