“舞蹈家”懷特先生(Dance Dance Revolution)

DP,還是DP
  1. #include <stdio.h>
  2. #include <math.h>
  3. #define min(a,b) ((a)<(b)) ? (a) : (b)
  4. #define MAXSIZE 100
  5. int pis[MAXSIZE];//存放要移動的箭頭序號
  6. int memory[MAXSIZE][4][4];
  7. int effort(int src, int des)//0原點, 1右,2下,3左, 4上
  8. {
  9.     //決策:
  10.     //中心到目標位置           src==0
  11.     //一隻腳移動到相鄰位置        (abs(src-des)%2)==1
  12.     //一隻腳移動到相對位置        (abs(src-des)%2)==0
  13.     //一隻腳在原地再踩一下        src==des
  14.     if (src==des)
  15.         return 1;
  16.     if (src==0)
  17.         return 2;
  18.     if ((abs(src-des)%2)==1)
  19.         return 3;
  20.     if ((abs(src-des)%2)==0)
  21.         return 4;
  22.     return 0;
  23. }
  24. int dp(int n, int lf, int rf)//狀態:從左腳位置爲lf,右腳位置爲rf的狀態移動到pis[n]所耗費的體力
  25. {
  26.     if (memory[n][lf][rf]!=-1)
  27.         return memory[n][lf][rf];
  28.     else{
  29.         if (pis[n]==-1){
  30.             memory[n][lf][rf]=0;
  31.             return 0;
  32.         }
  33.         else{
  34.             int val=9000000;
  35.             val=min(val, min(dp(n+1, pis[n], rf)+effort(lf, pis[n]), dp(n+1, lf, pis[n])+effort(rf, pis[n])));//狀態轉移方程
  36.             memory[n][lf][rf]=val;  
  37.             return val;
  38.         }
  39.     }
  40. }
  41. void InitialAndReadFile()
  42. {
  43.     int i, j, k;
  44.     for (i=0; i<MAXSIZE; i++)
  45.         pis[i]=-1;
  46.     for (i=0; i<MAXSIZE; i++){
  47.         for (j=0; j<4; j++)
  48.             for (k=0; k<4; k++)
  49.                 memory[i][j][k]=-1;
  50.     }
  51.     freopen("ddr.txt""r", stdin);
  52.     i=0;
  53.     while (scanf("%d", &pis[i++])!=EOF)
  54.         ;
  55. }
  56. void OutPut()
  57. {
  58.     int res;
  59.     res=dp(0, 0, 0);
  60.     printf("%d/n", res);
  61. }
  62. main(int argc, char *argv[])
  63. {
  64.     InitialAndReadFile();
  65.     OutPut();
  66. }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章