T1.进制转换
给出一个十进制数n,以及一个负进制的基数r,求n的r进制。
一开始想到dfs。。。觉得那么点范围可能还是够的。。。然后。。。发现可能是20^n???算了算了。。。。
然后想想,干脆直接短除法骗分算了哇,总不会爆零的。。
然后样例都没过。。。发现有负数。。。
那个气啊。。。
然后跑去打别的题。。。
突然灵光一闪,十进制减法的时候有个叫退位的神奇玩意儿,可以用在r进制上!!
哇那个兴奋,直接就打了上去。。。不过有一点要注意,那就是,高一位的位权值是异号!!加减换一下就好啦。。
T2.乘积最大
经典的dp啦。给出长度为n的字符串,加上k个乘号,求最大值。
想都没想打了个dp,f[i][j][k]表示i到j加了k个乘号的最大值。。转移方程很简单就不说了。
还有hc的做法是,用f[i][j]表示1到i的范围内,加入j个乘号的最大值,这样只要枚举断点,然后后面的部分不加乘号就可以了,时间复杂度低得多。
T3.单词接龙
给出n个单词,以及一个开头字母。当且仅当某单词的后缀(不包含单词本身)是另一个单词的前缀时,可以接龙。每个单词最多用两次,求以给出字母开头的最长龙的长度。
想不出什么算法,就直接dfs了(居然是正解??)。只是多了一步预处理,处理出两个单词的连接的最小重叠数就好了。
T4.方格取数
这个更经典。。。给出n*n的方格,某些格子里有些值。现在从左上向右下走两次,取到的最大值。
设f[i,j,k]表示走到了第i步,第一条路径向右走了j步,第二条路径向右走了k步。
f[i,j,k]=max{f[i-1,j,k],f[i-1,j-1,k],f[i-1,j-1,k-1],f[i-1,j,k-1]}+(j==k?a[i-j+1][i]: a[i-j+1][j]+a[i-k+1][k]);
说白了就是退着走。。。然后判断一下是否走到同一点上就好了。。。