悦动达人 (多维dp)

悦动达人

Description

一个游戏,在屏幕上有5个格子形成一行,每一秒都会有一个格子闪烁,格子闪烁时你需要保证至少有一只手指在格子上面, 现在我们已经知道第i秒时,第xi个格子会闪烁,我们假设手指的移动不花费时间,你现在用两根手指玩这个游戏, 设初始两根手指都在0处位置,算出n秒过后手指需要移动的最小距离。(允许手指交叉)

注:手指移动的距离的计算是,假设你的一根从x,移动到y格,那么移动的距离是|x-y|

Input

第一行一个数T,表示有T组测试数据(T<=50) 第二行,n,表示进行n秒(1<=n<=10^4) 下一行 n个数,xi(0<=xi<=4)

Output

输出n秒过后手指需要移动的最小距离.

Sample Input

1 2 0 2

Sample Output

2

HINT

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 const int inf = 0x3f3f3f3f ;
 5 int T ;
 6 int n ;
 7 int x ;
 8 int a[10 + 10000][5][5] ;
 9
10 void init ()
11 {
12     for (int i = 0 ; i <= n ; i++ ) {
13         for (int j = 0 ; j < 5 ; j++ ) {
14             for (int k = 0 ; k < 5 ; k++ ) {
15                 a[i][j][k] = inf ;
16             }
17         }
18     }
19     a[0][0][0] = 0 ;
20 }
21
22 int solve ()
23 {
24     int x ;
25     for (int i = 1 ; i <= n  ; i++) {
26         scanf ("%d" , &x ) ;
27         for (int j = 0 ; j < 5 ; j++ ) {
28             for (int k = 0 ; k < 5 ; k++ ) {
29                 a[i][j][k] = a[i - 1][j][k] ;
30               //  printf ("%-10d " , a[i][j][k]) ;
31             }
32            // puts ("") ;
33         }
34      //   puts ("") ;
35         for (int j = 0 ; j < 5 ; j++ ) {
36             for (int k = 0 ; k < 5 ; k++ ) {
37                 if (a[i - 1][j][k] + fabs (j - x) < a[i][x][k]) {
38                     a[i][x][k] = a[i - 1][j][k] + fabs (j - x) ;
39                 }
40                 if (a[i - 1][j][k] + fabs (k - x) < a[i][j][x]) {
41                     a[i][j][x] = a[i - 1][j][k] + fabs (k - x) ;
42                 }
43                 if (j - x != 0 && k - x != 0) {
44                         a[i][j][k] = inf ;
45                 }
46             }
47         }
48     }
49   /*  for (int  i = 0 ; i < 5 ; i++) {
50         for (int j = 0 ; j < 5 ; j++) {
51             printf ("%-10d " , a[n][i][j]) ;
52         }
53         puts ("") ;
54     }
55     puts ("") ; */
56 }
57
58 int main ()
59 {
60    // freopen ("a.txt" , "r" , stdin ) ;
61     scanf ("%d" , &T ) ;
62     while (T--) {
63         scanf ("%d" , &n ) ;
64         init () ;
65         solve () ;
66         int minn = inf ;
67         for (int i = 0 ; i < 5 ; i++) {
68             for (int j = 0 ; j < 5 ; j++) {
69                 if (a[n][i][j] < minn) {
70                     minn = a[n][i][j] ;
71                 }
72             }
73         }
74         printf ("%d\n" , minn ) ;
75     }
76     return 0 ;
77 }

第一道手刃的多维dp。
一开始还以为这倒也可以用省空间的写法写,但果断orz

总体来说写的蛮顺利。

时间: 2024-08-26 23:55:17

悦动达人 (多维dp)的相关文章

HDU 4901 The Romantic Hero(二维dp)

题目大意:给你n个数字,然后分成两份,前边的一份里面的元素进行异或,后面的一份里面的元素进行与.分的时候按照给的先后数序取数,后面的里面的所有的元素的下标一定比前面的大.问你有多上种放元素的方法可以使得前面异或的值和后面与的值相等. dp[x][y] 表示走到第x步,得到y这个数字一共有多少种方法. 但是需要注意这里得分一下,不能直接用dp数组存种数,你需要分一下从上一层过来的次数,和这一层自己可以到达的次数.然后取和的时候前后两个集合的种数进行乘法,注意边乘边取余. 顺便给一组数据: 4 3

二维dp(O(N^3)实现) zoj3230

1 #include<iostream> 2 #include<string.h> 3 #include<stdio.h> 4 #define maxn 125 5 using namespace std; 6 7 int cost[maxn][maxn],w[maxn][maxn]; 8 int dp[maxn][maxn]; 9 int N,M; 10 int main(){ 11 while(cin>>N>>M){ 12 if (N==0

hoj_10014_二维DP

The Triangle Time Limit: 1000ms, Special Time Limit:2000ms, Memory Limit:32768KB Total submit users: 952, Accepted users: 860 Problem 10014 : No special judgement Problem description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number tr

XTU1168:Alice and Bob(二维DP)

摘要:Dota(Defence of the Ancients,远古的守护), 是指基于魔兽争霸3:冰封王座(暴雪娱乐公司出品)的多人即时对战自定义地图,可支持10个人同时连线游戏.Dota以对立的两个小队展开对战,通常是5v5,游戏目的是守护自己的远古遗迹(近卫方的生命之树.天灾方的冰封王座),同时摧毁对方的远古遗迹.DotA是目前唯一被暴雪娱乐公司官方认可的魔兽争霸RPG.Dota在大学生中的风靡程度令人咂舌,而随着玩家对游戏的理解深入,本身存在于游戏中的许多数学模型被挖掘出来进行研究.游戏

HDU 5074 Hatsune Miku(简单二维dp)

题目大意:给你一些音符之间的联系,给你一个串,让你求出这个串的最大值.-1的时候可以任意替代,其他情况必须为序列上的数. 解题思路:简单二维dp,分情况处理就可以了啊. Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 637    Accepted Submission(s): 458 Problem De

(review)zoj4800 二维dp 状态转移很灵活

1 #include<iostream> 2 #include<stdio.h> 3 4 using namespace std; 5 6 double dp[10005][125]; 7 double p[125][125]; 8 int pk[10005]; 9 10 int N,M; 11 12 double fmax(double a,double b){ 13 if(a-b>0) return a;else return b; 14 } 15 int main(){

POJ - 1170 Shopping Offers (五维DP)

题目大意:有一个人要买b件商品,给出每件商品的编号,价格和数量,恰逢商店打折.有s种打折方式.问怎么才干使买的价格达到最低 解题思路:最多仅仅有五种商品.且每件商品最多仅仅有5个,所以能够用5维dp来表示.每一个维度都代表一件商品的数量 打折的方式事实上有b + s种.将每种商品单件卖的也算一种打折方式 这题有个坑点,就是b或者s有可能为0 #include<cstdio> #include<cstring> #include<algorithm> #include&l

codeforces118D - Caesar&#39;s Legions 多维DP

题意:给你n1个人,n2匹马站成一排,最多k1个人连续站,最多k2匹马连续站,问你有多少种方法 解题思路:4维dp,i,j,s,k分别代表位置,已经站了多少人,前一个站的是人还是马,一共连续站了几位了. 解题代码: 1 // File Name: 118d.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月25日 星期五 15时35分03秒 4 5 #include<vector> 6 #include<list> 7 #i

NOJ1060 接苹果 二维DP

题目描述 很少有人知道奶牛爱吃苹果.农夫约翰的农场上有两棵苹果树(编号为1和2), 每一棵树上都长满了苹果.奶牛贝茜无法摘下树上的苹果,所以她只能等待苹果 从树上落下.但是,由于苹果掉到地上会摔烂,贝茜必须在半空中接住苹果(没有人爱吃摔烂的苹果).贝茜吃东西很快,她接到苹果后仅用几秒钟就能吃完.每一分钟,两棵苹果树其中的一棵会掉落一个苹果.贝茜已经过了足够的训练, 只要站在树下就一定能接住这棵树上掉落的苹果.同时,贝茜能够在两棵树之间 快速移动(移动时间远少于1分钟),因此当苹果掉落时,她必定站