Hdu 4540 威威猫系列故事——打地鼠(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4540
解题思路:每一步暴力的用之前每一位记录的最小值即到现在这部需要的消耗比较,取最小的,转移方程:dp[i][j]=min(dp[i][j],dp[i-1][k]+abs(num[i-1][k]-num[i][j]));
代码如下:
c:
#include <bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff
typedef long long ll;
int n,k;
ll num[25][15],dp[25][15];
int main() {
while(scanf("%d %d",&n,&k)!=EOF){
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
scanf("%lld",&num[i][j]);
}
}
for(int i=1;i<=k;i++)dp[1][i]=0;
ll mn=inf;
for(int i=2;i<=n;i++){
for(int j=1;j<=k;j++){
dp[i][j]=inf;
for(int z=1;z<=k;z++){
dp[i][j]=min(dp[i][j],dp[i-1][z]+abs(num[i-1][z]-num[i][j]));
}
}
}
for(int i=1;i<=k;i++){
mn=min(mn,dp[n][i]);
}
printf("%lld\n",mn);
}
return 0;
}
java:
import java.io.*;
public class Main{
private static int n,k;
private static long [][]a;
private static long [][]dp;
private static final long INF =0x7fffffff;
private static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
private static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
private static long nextLong()throws IOException{
in.nextToken();
return((long)in.nval);
}
public static void main(String []args)throws IOException{
while(in.nextToken()!=StreamTokenizer.TT_EOF){
n=(int)in.nval;
k=(int)nextLong();
a=new long[n][k];
dp=new long[n][k];
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
a[i][j]=nextLong();
}
}
for(int i=1;i<n;i++){
for(int j=0;j<k;j++){
dp[i][j]=INF;
for(int l=0;l<k;l++){
dp[i][j]=Math.min(dp[i][j],dp[i-1][l]+Math.abs(a[i-1][l]-a[i][j]));
}
}
}
long min=INF;
for(int i=0;i<k;i++){
min=Math.min(min,dp[n-1][i]);
}
out.println(min);
out.flush();
}
}
}