动态规划——接金币

问题

小赛非常喜欢玩游戏,最近喜欢上了一个接金币的游戏。在游戏中,使用帽子左右移动接金币,金币接的越多越好,但是金币掉到地上就不能再接了。为了方便问题的描述,我们把电脑屏幕分成11格,帽子每次能左右移动一格。现在给电脑屏幕如图标上坐标:

也就是说在游戏里,金币都掉落在0-10这11个位置。开始时帽子刚开始在5这个位置,因此在第一秒,帽子只能接到4,5,6这三个位置中其中一个位置上的金币。问小赛在游戏中最多可能接到多少个金币?(假设帽子可以容纳无穷多个金币)

输入

输入数据有多组。每组数据的第一行为以正整数n (0<n<100000),表示有n个金币掉在屏幕上上。在结下来的n行中,每行有两个整数x,T (0<T<100000),表示在第T秒有一个金币掉在x点上。同一秒钟在同一点上可能掉下多个金币。n=0时输入结束。输入数据以空格隔开
————————————————
版权声明:本文为CSDN博主「yong_zi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yong_zi/article/details/81612858

解决:使用动态规划,从后往前累加

(1)边界情况:下一次只有两次移动位置

(2)其他情况:有两次移动情况

(3)比较后取大

(4)分析图形可知可以转换为图为题:

code:

 1 package yrc4;
 2 
 3 import java.util.Scanner;
 4 /*
 5 动态规划实现
 6  */
 7 public class Main16_3 {
 8     public static void main(String args[]) {
 9         Scanner s = new Scanner(System.in);
10         int n;
11         int dp[][];
12         while(s.hasNext()) {
13             //横坐标为位置,纵坐标为时间(时间最大为10000)
14             dp = new int[11][100000];
15             n = s.nextInt();
16             int x,t,max=0;
17             //根据输入初始化二维数组
18             for(int i=0;i<n;i++) {
19                 x = s.nextInt();
20                 t = s.nextInt();
21                 max = t>max?t:max;
22                 dp[x][t]++;
23             }
24             //开始进行动态规划计算
25             for(int i=max-1;i>=0;i--) {
26                 for(int j=0;j<11;j++) {
27                     //处理边界情况
28                     if(j==0) {
29                         dp[j][i] += Math.max(dp[j][i+1], dp[j+1][i+1]);
30                     }else if(j==10) {
31                         dp[j][i] += Math.max(dp[j][i+1], dp[j-1][i+1]);
32                     }else {
33                         dp[j][i] += Math.max(dp[j][i+1], Math.max(dp[j-1][i+1], dp[j+1][i+1]));
34                     }
35                 }
36             }
37             //因为初始位置为5,所以直接输出(5,0)
38             System.out.println(dp[5][0]);
39         }
40         s.close();
41         
42     }
43 
44 }
原文地址:https://www.cnblogs.com/dream-flying/p/12793364.html