hdu4540 威威猫系列故事——打地鼠(简单DP)

来源:互联网 发布:手机网络超时怎么解决 编辑:程序博客网 时间:2024/05/21 08:02

虽然简单DP,但我还是想了半天。。。

状态方程:dp[i][j] = min(dp[i][j], dp[i - 1][l] + abs(a[i - 1][l] - a[i][j]))   (0 <= l <= k)。

把k的坐标写在数组里当成花费,从上往下规划,该层每个点都是前面节点经过此节点的最小能量消耗。

#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;const int N = 55;const int INF = 1<<27;int main(){  //  freopen("in.txt", "r", stdin);    int a[N][N], dp[N][N];    int j, i, n, k, num;    while(~scanf("%d%d", &n, &k))    {        num = INF;        for(i = 0; i < n; i ++)            for(j = 0; j < k; j ++)                scanf("%d", &a[i][j]);        memset(dp, 0, sizeof(0));        for(i = 1; i < n; i ++)            for(j = 0; j < k; j ++)            {                dp[i][j] = INF;                for(int l = 0; l < k; l ++)                    dp[i][j] = min(dp[i][j], dp[i - 1][l] + abs(a[i - 1][l] - a[i][j]));            }        for(i = 0; i < k; i ++)            num = min(num, dp[n - 1][i]);        printf("%d\n", num);    }    return 0;}


0 0
原创粉丝点击