hdu 4540 dp

题意:

假设:
  1、每一个时刻我们只能打一只地鼠,并且打完以后该时刻出现的所有地鼠都会立刻消失;
  2、老鼠出现的位置在一条直线上,如果上一个时刻我们在x1位置打地鼠,下一个时刻我们在x2位置打地鼠,那么,此时我们消耗的能量为abs( x1 - x2 );
  3、打第一只地鼠无能量消耗。

  现在,我们知道每个时刻所有冒出地面的地鼠位置,若在每个时刻都要打到一只地鼠,请计算最小需要消耗多少能量。

链接:点我

令dp[i][j]表示为第i次打j个地鼠所消耗的最少能量,转移方程见代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 #define cl(a) memset(a,0,sizeof(a))
13 #define ts printf("*****
");
14 const int MAXN=1005;
15 int n,m,tt;
16 int a[MAXN][MAXN],dp[MAXN][MAXN];
17 int main()
18 {
19     int i,j,k;
20     #ifndef ONLINE_JUDGE
21     freopen("1.in","r",stdin);
22     #endif
23     while(scanf("%d%d",&n,&m)!=EOF)
24     {
25         for(i=0;i<n;i++)
26             for(j=0;j<m;j++)
27             {
28                 scanf("%d",&a[i][j]);
29                 dp[i][j]=INF;
30             }
31         for(i=0;i<m;i++)    dp[0][i]=0;
32         for(i=1;i<n;i++)
33         {
34             for(j=0;j<m;j++)
35             {
36                 for(k=0;k<m;k++)
37                 {
38                     dp[i][j]=min(dp[i][j],dp[i-1][k]+abs(a[i][j]-a[i-1][k]));
39                 }
40             }
41         }
42         int minn=INF;
43         for(i=0;i<m;i++)
44         {
45             minn=min(minn,dp[n-1][i]);
46         }
47         printf("%d
",minn);
48     }
49 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4472870.html