2016.7.14代码思路总结

T1 、你在桌子上放白和黑两种颜色的石子,第i个石子放在左边第i个位置,一共放了N个石子,当你放第i个石子必须遵循以下规则:

1.当i是奇数时:直接放在左数第i个位置上;

2.当i是偶数时:如果第i个石子和第i-1个石子颜色相同,直接放在第i个位置上;否则把当前最右边的连续的颜色相同的石子全部用相反颜色的石子取代,然后在第i个位置上放下石子i。

例如,假设桌子上现状是:○○●●○○○(○代表白石子,●代表黑石子)

如果第8个石子是白色,因为它和第7个石子颜色相同,就直接放在最右边就可以了,桌面上变成:○○●●○○○○;

如果第8个石子是黑的,因为和第7个颜色不同,就先把右边连续的3个白石子用黑石子代替,然后再放下第8个石子,变成:○○●●●●●●。

写一个程序,给你每个石子的颜色,输出最终桌面上白石子的数量。


正解: 用一个f[ len ] [ x ] 数组 ,把输入的相同颜色分为一组,用len 来记录,x则用0和1来表示白色棋子和黑色棋子。每输入一个数据就做一次处理,按题目的要求,如是奇数个,判断是否与当前len 组棋子的颜色相同(例:f[ len ][ 0 ] > 0 则表示,len 的颜色为白色,否则就为黑色),如相同直接个数加1,不相同就 len+1,f[ len +1 ][ x]+1。
如是偶数个,则判断是否与当前 len 颜色相同,相同就加1,不同则把f[ len ] 的原颜色数量加给 f[ len-1][ x] ,且 f[ len-1][ x ]+1(要想懂)len -1,最后累计 f[1 ~ len] [0] 即可。

T2、 题目描述:写一个程序,给你两个字符串,计算最长的公共子串的长度。如果字符串s连续地出现在字符串t中,则称s是t的子串。
正解: 动态规划:f[i,j]:=f[i-1,j-1]+1;(s1[i]=s2[i]);
T3、 题目描述:射击规则如下:

你最多可以射击4次,当然你也可以不射击,目标靶被分成N部分,每一部分的分值为P1,….,PN,你的总分为每次射击的分数之和,如果S不超过M,那你的分数就是S;否则如果S超过M,那么你的分数变为0。

写一个程序,给你每部分的分值以及M的值,计算你能得到的最大得分。

正解: 把数据用另外两个数组存两两相加值,用二分求其最优解,最后累计最大值

T4、 人们通过在石头上跳跃从河的一边到达另一边。



如图所示,我们把石头的形状看作是一个正方形,一共有n行,这里n=5。

在游戏中,人们有两种方法:一种是普通跳跃和快速跳跃,快速跳跃的次数不得超过M。普通跳跃中,他们能从当前石头跳到下一行的某个石头,而快速跳跃使得他们能从一个石头跳到下一行的下一行某个石头处。出发的一边的下一行是第一行,第N行的下一行是对岸。

为了保证游戏的安全性,我们需要考虑每一次跳跃的危险系数,每个石头有一个自身的危险值,每次跳跃的危险系数计算方法如下:

(当前石头的危险系数+下一个到达石头的危险系数)*(水平距离)        

计算方法不考虑跳跃的种类,水平距离是两个石头所在列的差的绝对值,从岸边跳到某个石头或者从石头跳到岸边的危险系数为0。

写一个程序,给定N和M的值和每行石头的位置以及危险系数,计算从起始边到对岸最小的危险系数总和。输入保证一定可以到达对岸。
正解: 动态规划:没用快速弹跳 f[i][j][k]=min(f[i][j][k],f[i-1][l][k]+(op[i][j][2]+op[i-1][l][2])*abs(op[i][j][1] -op[i-1][l][1]));                  
           用了快速弹跳  f[i][j][k]=min(f[i][j][k],f[i-2][l][k-1]+(op[i][j][2]+op[i-2][l][2])*abs(op[i][j][1] -op[i-2][l][1]));     (  i:在第i行 ; j:在第j列 ;k:用了k次快速弹跳) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值