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<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
int n,m;
int dp[40][40];
int a[40][40];
int cal(int x)
{
    int t=n+m-1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if (i==1&&j==1)
                dp[i][j]=(a[i][j]*t-x)*(a[i][j]*t-x);
            else if (i==1) dp[i][j]=dp[i][j-1]+(a[i][j]*t-x)*(a[i][j]*t-x);
            else if (j==1) dp[i][j]=dp[i-1][j]+(a[i][j]*t-x)*(a[i][j]*t-x);
            else dp[i][j]=min(dp[i-1][j],dp[i][j-1])+(a[i][j]*t-x)*(a[i][j]*t-x);
        }
    return dp[n][m]/t;
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int ca=1;ca<=T;ca++)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        int l=0,r=2000;
        int ans=0x3f3f3f3f;
        for(int i=l;i<=r;i++)
            ans=min(ans,cal(i));
        printf("Case #%d: %d\n",ca,ans);
    }
    return 0;
}

  

时间: 2024-10-05 05:11:54

HDU 5492的相关文章

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 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

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取得

hdu 5492(dp)

题目描述: 给定一张30*30的图,图上每个点的权值不超过30,让你求 (N+M−1)∑N+M−1i=1(Ai−Aavg)2的最小值? 队友将这个式子化成了求方差D[x]=E(x^2)-E(x); 我猜测是DP,分析一下,这个式子并不具有最优子结构,假设可以经过A和B 到达终点c,选取这两个点的方差的最小值,说明到达这两个点的序列最稳定, 假设A点是较优点,但是可能会出现,到达A点的最优序列加上c的序列, 没有到达A的某一个序列加上c的序列优(稳定). 可以直接化简这个式子得到(A1^2+A2^

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 5492 网格图dp

#include<stdio.h> #include <math.h> #include <algorithm> #include <math.h> #include <string.h> #include <bitset> #include <iostream> using namespace std; #define LL long long int n,m,k; int a[31][31]; int f[31][31

补题列表

上海网络赛: HDU 5468 Puzzled Elena HDU 5469 Antonidas HDU 5473 There was a kingdom 合肥网络赛: HDU 5487 Difference of Languages HDU 5486 Difference of Clustering HDU 5489 Removed Interval HDU 5492 Find a path HDU 5493 Queue 弱校联萌Day1: B. Carries D. Vertex Cover

那些年没有AC的水题...

HDU 5492(dp 题目:一个数字矩阵,要求找到一条路径使得经过的数字的方差最小. 思路:稍微把式子变换一下,状态是走到当前格子和为k时最小平方和. /* * @author: Cwind */ #pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <map> #include <algorithm> #include <cstd