- #include <stdio.h>
- #include <math.h>
- #define min(a,b) ((a)<(b)) ? (a) : (b)
- #define MAXSIZE 100
- int pis[MAXSIZE];//存放要移動的箭頭序號
- int memory[MAXSIZE][4][4];
- int effort(int src, int des)//0原點, 1右,2下,3左, 4上
- {
- //決策:
- //中心到目標位置 src==0
- //一隻腳移動到相鄰位置 (abs(src-des)%2)==1
- //一隻腳移動到相對位置 (abs(src-des)%2)==0
- //一隻腳在原地再踩一下 src==des
- if (src==des)
- return 1;
- if (src==0)
- return 2;
- if ((abs(src-des)%2)==1)
- return 3;
- if ((abs(src-des)%2)==0)
- return 4;
- return 0;
- }
- int dp(int n, int lf, int rf)//狀態:從左腳位置爲lf,右腳位置爲rf的狀態移動到pis[n]所耗費的體力
- {
- if (memory[n][lf][rf]!=-1)
- return memory[n][lf][rf];
- else{
- if (pis[n]==-1){
- memory[n][lf][rf]=0;
- return 0;
- }
- else{
- int val=9000000;
- val=min(val, min(dp(n+1, pis[n], rf)+effort(lf, pis[n]), dp(n+1, lf, pis[n])+effort(rf, pis[n])));//狀態轉移方程
- memory[n][lf][rf]=val;
- return val;
- }
- }
- }
- void InitialAndReadFile()
- {
- int i, j, k;
- for (i=0; i<MAXSIZE; i++)
- pis[i]=-1;
- for (i=0; i<MAXSIZE; i++){
- for (j=0; j<4; j++)
- for (k=0; k<4; k++)
- memory[i][j][k]=-1;
- }
- freopen("ddr.txt", "r", stdin);
- i=0;
- while (scanf("%d", &pis[i++])!=EOF)
- ;
- }
- void OutPut()
- {
- int res;
- res=dp(0, 0, 0);
- printf("%d/n", res);
- }
- main(int argc, char *argv[])
- {
- InitialAndReadFile();
- OutPut();
- }
“舞蹈家”懷特先生(Dance Dance Revolution)
DP,還是DP
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.