程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 4540 威威貓系列故事——打地鼠 dp小水題

hdu 4540 威威貓系列故事——打地鼠 dp小水題

編輯:C++入門知識

Problem Description
  威威貓最近不務正業,每天沉迷於游戲“打地鼠”。
  每當朋友們勸他別太著迷游戲,應該好好工作的時候,他總是說,我是威威貓,貓打老鼠就是我的工作!
  無話可說...
  
  我們知道,打地鼠是一款經典小游戲,規則很簡單:每隔一個時間段就會從地下冒出一只或多只地鼠,玩游戲的人要做的就是打地鼠。

  假設:
  1、每一個時刻我們只能打一只地鼠,並且打完以後該時刻出現的所有地鼠都會立刻消失;
  2、老鼠出現的位置在一條直線上,如果上一個時刻我們在x1位置打地鼠,下一個時刻我們在x2位置打地鼠,那麼,此時我們消耗的能量為abs( x1 - x2 );
  3、打第一只地鼠無能量消耗。

  現在,我們知道每個時刻所有冒出地面的地鼠位置,若在每個時刻都要打到一只地鼠,請計算最小需要消耗多少能量。

 


Input
輸入數據包含多組測試用例;
每組數據的第一行是2個正整數N和K(1 <= N <= 20, 1 <= K <= 10 ),表示有N個時刻,每個時刻有K只地鼠冒出地面;
接下來的N行,每行表示一個時刻K只地鼠出現的坐標(坐標均為正整數,且<=500)。

 


Output
請計算並輸出最小需要消耗的能量,每組數據輸出一行。

 


Sample Input
2 2
1 10
4 9
3 5
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15


Sample Output
1
1


Source
2013騰訊編程馬拉松復賽第三場(3月31日)
 


Recommend
liuyiding
狀態轉移方程:
mmin[k][i]=mmin[k-1][j]+abs(a[k][i]-a[k-1][j]);
mmin[k][j] 表示打第k層第j個的時候所能得到的最小值


#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
int a[111][111],n,m;
int ans;
 int mmin[22][11];
int main()
{
    int i,j,k;
	while(cin>>n>>m)
	{
		ans=99999999;
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++) cin>>a[i][j];
		}
		for(k=0;k<n;k++)
		    for(i=0;i<m;i++) 
				mmin[k][i]=99999999;
		for(k=0;k<m;k++) mmin[0][k]=0;
		for(k=1;k<n;k++)
		{
          for(i=0;i<m;i++)
		  {
			for(j=0;j<m;j++)
			{
			    if(mmin[k][i]>mmin[k-1][j]+abs(a[k][i]-a[k-1][j]))
					mmin[k][i]=mmin[k-1][j]+abs(a[k][i]-a[k-1][j]);
			}
		  }
		}
		for(i=0;i<m;i++)
			if(ans>mmin[n-1][i]) ans=mmin[n-1][i];
		printf("%d\n",ans);
	}
	return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved