题意:
假设:
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 }