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]);

    说白了就是退着走。。。然后判断一下是否走到同一点上就好了。。。

posted on 2017-04-08 16:27  啊?  阅读(288)  评论(0编辑  收藏  举报