HDU 5492 Find a path

题意:

在一张N*M的图上,每个点都有权值,寻找一条从(1,1)到(n,m)的路径,使得

(n+m-1)*sigma(Ai-Aavg)最小

其中Aavg是路径上Ai的平均数

题解

看题目是一个DP,但是路径平均值得存在使得状态很难定义。

所以我们进行变形,将和式展开之后,得到ans=(n+m-1)*S1-S2;

其中S1是路径上所有数的平方和,S2为路径上数的和的平方。

也就是要求S1最小的同时S2最大。

dp[i][j][s]表示到达(i,j)时平方和为s时和的的最小值,答案通过枚举所有s取得

#include<bits/stdc++.h>

#define clr(x,y) memset((x),(y),sizeof(x))

using namespace std;
typedef long long LL;

const int maxn=30;
const int inf=1e8;

int mp[maxn+5][maxn+5];
int dp[maxn+5][maxn+5][2*maxn*maxn+5];
int n,m;

void solve(int iCase)
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;++i)
    {
        for (int j=1;j<=m;++j)
        {
            scanf("%d",&mp[i][j]);
        }
    }

    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j)
            for (int k=0;k<=2*maxn*maxn;++k)
                dp[i][j][k]=inf;

    dp[1][1][mp[1][1]]=mp[1][1]*mp[1][1];
    for (int i=1;i<=n;++i)
    {
        for (int j=1;j<=m;++j)
        {
            if (i==1 && j==1) continue;
            for (int k=0;k<=2*maxn*maxn;++k)
            {
                if (i-1>=1 && k>=mp[i][j])
                    dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k-mp[i][j]]+mp[i][j]*mp[i][j]);
                if (j-1>=1 && k>=mp[i][j])
                    dp[i][j][k]=min(dp[i][j][k],dp[i][j-1][k-mp[i][j]]+mp[i][j]*mp[i][j]);
            }
        }
    }

    int ans=inf;
    for (int k=0;k<=2*maxn*maxn;++k)
    {
        if (dp[n][m][k]==inf) continue;
        int tmp=(n+m-1)*dp[n][m][k]-k*k;
        ans=min(ans,tmp);
    }
    printf("Case #%d: %d\n",iCase,ans);
}

int main(void)
{
    #ifdef ex
    freopen ("../in.txt","r",stdin);
    //freopen ("../out.txt","w",stdout);
    #endif

    int T;
    scanf("%d",&T);

    for (int i=1;i<=T;++i)
    {
        solve(i);
    }
}
时间: 2024-10-21 15:48:57

HDU 5492 Find a path的相关文章

HDU 5492 Find a path DP

Find a path Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5492 Description Frog fell into a maze. This maze is a rectangle containing N rows and M columns. Each grid in this maze contains a number, which is cal

【动态规划】HDU 5492 Find a path (2015 ACM/ICPC Asia Regional Hefei Online)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意: 一个N*M的矩阵,一个人从(1,1)走到(N,M),每次只能向下或向右走.求(N+M-1)ΣN+M-1(Ai-Aavg)2最小.Aavg为平均值. (N,M<=30,矩阵里的元素0<=C<=30) 题目思路: [动态规划] 首先化简式子,得原式=(N+M-1)ΣN+M-1(Ai2)-(ΣN+M-1Ai)2 f[i][j][k]表示走到A[i][j]格子上,此时前i+j-1

2015合肥网络赛 HDU 5492 Find a path 动归

1 #include <iostream> 2 #include <cstdio> 3 #include <fstream> 4 #include <algorithm> 5 #include <cmath> 6 #include <deque> 7 #include <vector> 8 #include <queue> 9 #include <string> 10 #include <cs

HDU - 2290 Find the Path(最短路)

HDU - 2290 Find the Path Time Limit: 5000MS   Memory Limit: 64768KB   64bit IO Format: %I64d & %I64u Submit Status Description Scofield is a hero in American show "Prison Break". He had broken the prison and started a big runaway. Scofield h

HDU 5492(DP) Find a path

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意是有一个矩阵,从左上角走到右下角,每次能向右或者向下,把经过的数字记下来,找出一条路径是这些数的方差最小. Find a path Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 961    Accepted Submissi

HDU 5492

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5492 题意:在一个n*m的矩形中找一条从(1,1)到(n,m)的路径,使得方差最小 因为 所以我们枚举平均数就行了 如果我们直接枚举平均数,可能会是小数,所以我们要乘上(n+m-1)以后再枚举 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmat

hdu 4725 The Shortest Path in Nya Graph(建图+优先队列dijstra)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:有n个点和n层,m条边,每一层的任意一个点都可以花费固定的值到下一层或者上一层的任意点 然后m条边链接的点可以花费给出的值进行转移,最后问从i点到n点最少要花费多少. 这题点的个数有100000,层数也是100000,不算额外边暴力建边肯定要爆. 所以可以把层数也当成一个点比如说i点在j层于是n+j就与i链接花费0然后i点可以和上下层任意一个点链接 及i与n+j+1链接i与n+j-1链接

HDU 6223 Infinite Fraction Path(BFS+剪枝)

The ant Welly now dedicates himself to urban infrastructure. He came to the kingdom of numbers and solicited an audience with the king. He recounted how he had built a happy path in the kingdom of happiness. The king affirmed Welly's talent and hoped

hdu 6223 Infinite Fraction Path

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6223 题意:给定长度为n的一串数字S,现在要按照一种规则寻找长度为n的数字串,使得该数字串的字典序最大.规则:从数字串S的某一个下标为x的数字出发,可以到达的下一个数字是下标为(x*x+1)%n的数字. 思路:BFS+剪枝.剪枝技巧: 1:遍历到某一层的节点时,记录已经到达过的节点,下次如果还经过就直接不考虑. 2:当前遍历到的某一层节点的数字较之前的小,直接不考虑. AC代码: #define _