HDU 1176 免费馅饼

链接

免费馅饼 - http://acm.hdu.edu.cn/showproblem.php?pid=1176

分析

  • 模型 - 横轴为位置,纵轴为时间;初始位置为红色,馅饼分布在网格中。
    • 动态问题静态化
    • 图中蓝色的馅饼接不到
    • 虚线范围内的都能接到HDU 1176 免费馅饼_第1张图片

  • 状态及分类
    • 设向右移动为1,向左移动为-1,不动为0,则 { … , 1 , … , − 1 , … , 0 , … ⏞ T 个 } \{\overbrace{…,1,…,-1,…,0,…}^{T个}\} { 110 T}为T秒末的状态
    • (T, X)表示T秒末在X位置上,这表示了一类状态
    • 末状态可以分为11类
  • 递推
    • 到哪里去?

      • 无法空间优化
      • 具体过程
        ( 0 , 5 ) ⇒ (0,5)\Rightarrow (0,5) ( 1 , 4 ) 、 ( 1 , 5 ) 、 ( 1 , 6 ) ⇒ (1,4)、(1,5)、(1,6)\Rightarrow (1,4)(1,5)(1,6) ( 2 , 3 ) 、 ( 2 , 4 ) 、 ( 2 , 5 ) 、 ( 2 , 6 ) 、 ( 2 , 7 ) ⇒ (2,3)、 (2,4)、(2,5)、(2,6)、(2,7)\Rightarrow (2,3)(2,4)(2,5)(2,6)(2,7) ( 3 , 2 ) 、 ( 3 , 3 ) 、 ( 3 , 4 ) 、 ( 3 , 5 ) 、 ( 3 , 6 ) 、 ( 3 , 7 ) 、 ( 3 , 8 ) ⇒ (3,2)、 (3,3)、 (3,4)、(3,5)、(3,6)、(3,7)、(3,8)\Rightarrow (3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(3,8) ( 4 , 1 ) 、 ( 4 , 2 ) 、 ( 4 , 3 ) 、 ( 4 , 4 ) 、 ( 4 , 5 ) 、 ( 4 , 6 ) 、 ( 4 , 7 ) 、 ( 4 , 8 ) 、 ( 4 , 9 ) ⇒ (4,1)、(4,2)、 (4,3)、 (4,4)、(4,5)、(4,6)、(4,7)、(4,8)、(4,9)\Rightarrow (4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(4,8)(4,9) ( 5 , 0 ) 、 ( 5 , 1 ) 、 ( 5 , 2 ) 、 ( 5 , 3 ) 、 ( 5 , 4 ) 、 ( 5 , 5 ) 、 ( 5 , 6 ) 、 ( 5 , 7 ) 、 ( 5 , 8 ) 、 ( 5 , 9 ) 、 ( 5 , 10 ) ⇒ (5,0)、(5,1)、(5,2)、 (5,3)、 (5,4)、(5,5)、(5,6)、(5,7)、(5,8)、(5,9)、(5,10)\Rightarrow (5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7)(5,8)(5,9)(5,10) … … ……
    • 从哪里来?

      • 空间可优化,但边界处理复杂
      • 顺序
        ( 0 , 5 ) ⇒ \xcancel{(0,5)\Rightarrow} (0,5) ( 1 , 4 ) 、 ( 1 , 5 ) 、 ( 1 , 6 ) ⇒ (1,4)、(1,5)、(1,6)\Rightarrow (1,4)(1,5)(1,6) ( 2 , 3 ) 、 ( 2 , 4 ) 、 ( 2 , 5 ) 、 ( 2 , 6 ) 、 ( 2 , 7 ) ⇒ (2,3)、 (2,4)、(2,5)、(2,6)、(2,7)\Rightarrow (2,3)(2,4)(2,5)(2,6)(2,7) ( 3 , 2 ) 、 ( 3 , 3 ) 、 ( 3 , 4 ) 、 ( 3 , 5 ) 、 ( 3 , 6 ) 、 ( 3 , 7 ) 、 ( 3 , 8 ) ⇒ (3,2)、 (3,3)、 (3,4)、(3,5)、(3,6)、(3,7)、(3,8)\Rightarrow (3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(3,8) ( 4 , 1 ) 、 ( 4 , 2 ) 、 ( 4 , 3 ) 、 ( 4 , 4 ) 、 ( 4 , 5 ) 、 ( 4 , 6 ) 、 ( 4 , 7 ) 、 ( 4 , 8 ) 、 ( 4 , 9 ) ⇒ (4,1)、(4,2)、 (4,3)、 (4,4)、(4,5)、(4,6)、(4,7)、(4,8)、(4,9)\Rightarrow (4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(4,8)(4,9) ( 5 , 0 ) 、 ( 5 , 1 ) 、 ( 5 , 2 ) 、 ( 5 , 3 ) 、 ( 5 , 4 ) 、 ( 5 , 5 ) 、 ( 5 , 6 ) 、 ( 5 , 7 ) 、 ( 5 , 8 ) 、 ( 5 , 9 ) 、 ( 5 , 10 ) ⇒ (5,0)、(5,1)、(5,2)、 (5,3)、 (5,4)、(5,5)、(5,6)、(5,7)、(5,8)、(5,9)、(5,10)\Rightarrow (5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7)(5,8)(5,9)(5,10) … … ……

  • 末位置看成初始位置
    • 11个初始位置能对应11类末状态
    • 末位置在原初始位置的那些路径与原始问题的路径一一对应
    • 从哪里来?
      • 空间可优化,代码简洁
      • 递推过程
        ( 0 , 0 ) 、 ( 0 , 1 ) 、 ( 0 , 2 ) 、 ( 0 , 3 ) 、 ( 0 , 4 ) 、 ( 0 , 5 ) 、 ( 0 , 6 ) 、 ( 0 , 7 ) 、 ( 0 , 8 ) 、 ( 0 , 9 ) 、 ( 0 , 10 ) (0,0)、(0,1)、(0,2)、 (0,3)、 (0,4)、\color{red}{(0,5)}\color{black}{、(0,6)、(0,7)、(0,8)、(0,9)、(0,10)} (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(0,9)(0,10) ( 1 , 0 ) 、 ( 1 , 1 ) 、 ( 1 , 2 ) 、 ( 1 , 3 ) 、 ( 1 , 4 ) 、 ( 1 , 5 ) 、 ( 1 , 6 ) 、 ( 1 , 7 ) 、 ( 1 , 8 ) 、 ( 1 , 9 ) 、 ( 1 , 10 ) ⇑ (1,0)、(1,1)、(1,2)、 (1,3)、 (1,4)、(1,5)、(1,6)、(1,7)、(1,8)、(1,9)、(1,10)\Uparrow (1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(1,9)(1,10) ( 2 , 0 ) 、 ( 2 , 1 ) 、 ( 2 , 2 ) 、 ( 2 , 3 ) 、 ( 2 , 4 ) 、 ( 2 , 5 ) 、 ( 2 , 6 ) 、 ( 2 , 7 ) 、 ( 2 , 8 ) 、 ( 2 , 9 ) 、 ( 2 , 10 ) ⇑ (2,0)、(2,1)、(2,2)、 (2,3)、 (2,4)、(2,5)、(2,6)、(2,7)、(2,8)、(2,9)、(2,10)\Uparrow (2,0)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(2,8)(2,9)(2,10) ( 3 , 0 ) 、 ( 3 , 1 ) 、 ( 3 , 2 ) 、 ( 3 , 3 ) 、 ( 3 , 4 ) 、 ( 3 , 5 ) 、 ( 3 , 6 ) 、 ( 3 , 7 ) 、 ( 3 , 8 ) 、 ( 3 , 9 ) 、 ( 3 , 10 ) ⇑ (3,0)、(3,1)、(3,2)、 (3,3)、 (3,4)、(3,5)、(3,6)、(3,7)、(3,8)、(3,9)、(3,10)\Uparrow (3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(3,8)(3,9)(3,10) ( 4 , 0 ) 、 ( 4 , 1 ) 、 ( 4 , 2 ) 、 ( 4 , 3 ) 、 ( 4 , 4 ) 、 ( 4 , 5 ) 、 ( 4 , 6 ) 、 ( 4 , 7 ) 、 ( 4 , 8 ) 、 ( 4 , 9 ) 、 ( 4 , 10 ) ⇑ (4,0)、(4,1)、(4,2)、 (4,3)、 (4,4)、(4,5)、(4,6)、(4,7)、(4,8)、(4,9)、(4,10)\Uparrow (4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(4,8)(4,9)(4,10) ( 5 , 0 ) 、 ( 5 , 1 ) 、 ( 5 , 2 ) 、 ( 5 , 3 ) 、 ( 5 , 4 ) 、 ( 5 , 5 ) 、 ( 5 , 6 ) 、 ( 5 , 7 ) 、 ( 5 , 8 ) 、 ( 5 , 9 ) 、 ( 5 , 10 ) ⇑ (5,0)、(5,1)、(5,2)、 (5,3)、 (5,4)、(5,5)、(5,6)、(5,7)、(5,8)、(5,9)、(5,10)\Uparrow (5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7)(5,8)(5,9)(5,10) … … ⇑ ……\Uparrow

代码

/* hdu 1176 免费馅饼 逆路径 从哪里来?*/
#include 
using namespace std;
#define MXX 15
#define MXT 100010
int n, dp[MXT][MXX];
int main(){
     
    int T, t, x;    
    while(scanf("%d", &n), n){
     
        T = 0;        
        memset(dp, 0, sizeof dp);
        for(int i = 1; i <= n; ++i){
     
            scanf("%d %d", &x, &t);
            dp[t][x]++;
            if(T < t) T = t;
        }
        for(int i = T; i >= 0; --i) {
     
            for(int j = 0; j <= 10; ++j){
     
                // 越界访问,但无影响
                dp[i][j] = max(dp[i+1][j-1], max(dp[i+1][j],dp[i+1][j+1]))+dp[i][j]; 
            }
        }
        printf("%d\n", dp[0][5]);
    }
    return 0;
}
/* hdu 1176 免费馅饼 逆路径 从哪里来?*/
#include 
using namespace std;
#define MXX 17
#define MXT 100010
int n, dp[MXT][MXX];
int main(){
     
    int T, t, x;    
    while(scanf("%d", &n), n){
     
        T = 0;        
        memset(dp, 0, sizeof dp);
        for(int i = 1; i <= n; ++i){
     
            scanf("%d %d", &x, &t);
            dp[t][x+1]++;
            if(T < t) T = t;
        }
        for(int i = T; i >= 0; --i) {
     
            for(int j = 1; j <= 11; ++j){
     
                dp[i][j] = max(dp[i+1][j-1], max(dp[i+1][j],dp[i+1][j+1]))+dp[i][j];
            }
        }
        printf("%d\n", dp[0][6]);
    }
    return 0;
}

你可能感兴趣的:(算法入门,#,动态规划初步)