• shanghai 2000 regional 2031 dance dance revolution DP


    2031 - Dance Dance Revolution
    Asia - Shanghai - 2000/2001

    //https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=32

    看代码中的注释

    View Code
     1 //怀特先生跳舞
     2 #include <cstdio>
     3 #define MAXN 100005
     4 #define INF 100000000
     5 int cur;
     6 int a[MAXN];
     7 //该过程自然不会出现最后答案中有两只脚踩在同一位置,因为如果已有一只脚踩在那里,完全会是该脚再动一下,而不是把另一只脚也移过来
     8 //逆推,因为从初试位置(0,0)到跳完一系列舞步所耗费的体力可以想成从最后一个舞步开始,跳到初试位置耗费的体力
     9 int d[5][5][MAXN];//d[i][j][k]表示在将要跳舞步k时,左脚踩在位置i,右脚踩在位置j时已耗费的最少体力
    10 int effort[5][5]= //effort[a][b]表示从位置a移动到位置b要耗费的最少体力
    11 {
    12     {1,2,2,2,2},
    13     {2,1,3,4,3},
    14     {2,3,1,3,4},
    15     {2,4,3,1,3},
    16     {2,3,4,3,1}
    17 };
    18 int main()
    19 {
    20 //    freopen("in.cpp","r",stdin);
    21     while(1)
    22     {
    23         int fis;
    24         scanf("%d",&fis);
    25         if(fis == 0) break;
    26         cur = 0;
    27         while(1)
    28         {
    29             a[++cur] = fis;
    30             scanf("%d",&fis);
    31             if(fis == 0) break;
    32         }
    33         int i,j,k,t;
    34         for(k =0; k <= cur; ++k)//因为是要算最少,所以初始值是正无穷
    35             for(i=0; i < 5; ++i)
    36                 for(j=0; j < 5; ++j)
    37                     d[i][j][k] = INF;
    38         for(i=0; i<5; ++i)//逆推最后总是会有一只脚站在a[cur]位置上,所以为0
    39             d[i][a[cur]][cur] = 0;
    40         for(j=0; j<5; ++j)
    41             d[a[cur]][j][cur] = 0;
    42         d[a[cur]][a[cur]][cur] = INF;
    43         a[0] = 0;//舞步0是自己添加的为0,最后两只脚都踩在位置0
    44         for(k = cur-1; k >= 0; --k)
    45         {
    46             for(i=0; i<5; ++i)
    47             {
    48                 for(j=0; j<5; ++j)
    49                 {
    50                     t = d[a[k+1]][j][k+1] + effort[a[k+1]][i];//跳k+1步时用的是左脚,转移方程
    51                     if(d[i][j][k] > t)
    52                         d[i][j][k] = t;
    53                     t = d[i][a[k+1]][k+1] + effort[a[k+1]][j];//用的是右脚,转移方程
    54                     if(d[i][j][k] > t)
    55                         d[i][j][k] = t;
    56                 }
    57             }
    58         }
    59         printf("%d\n",d[0][0][0]);
    60     }
    61     return 0;
    62 }
  • 相关阅读:
    学会使用控件之comboxBox in asp.net 从简单开始(五)
    学会使用控件从简单开始(四)
    关于SQL计算差值的问题
    关于CSS3的一些代码
    显式实现的接口成员从简单开始(三)
    网页选项卡(TAB)今天晚上搞了一晚上这个
    关于页面刷新
    委托和匿名方法从简单开始(一)
    短信监听器
    android中handler处理message小例子
  • 原文地址:https://www.cnblogs.com/allh123/p/3067331.html
Copyright © 2020-2023  润新知