hdu 5492 (暴力+nice)

题意:在矩阵中,找一条路从 (1,1)->(n,m),使方差最小

思路: T = (N+M1)N+M1i=1(AiAavg)2

将N + M - 1乘进去,即求1 ~ N+M-1,(N + M - 1)*A[i] - (A[i] + ..... + A[N]) 的和由于

假设Aavg可以是任何数,但只有当其是平均值时T才会最小(感觉别人都好厉害 /(ㄒoㄒ)/~~)


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <time.h>
#include <algorithm>
typedef long long ll;
using namespace std;
int a[35][35],f[35][35];
int n,m;
int fin(int x)
{
    int N = n+m-1;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            if(i == 1 && j == 1)
                f[i][j] = (N*a[i][j]-x)*(N*a[i][j] - x);
            else if(i == 1)
                f[i][j] = f[i][j-1] + (N*a[i][j]-x)*(N*a[i][j] - x);
            else if(j == 1)
                f[i][j] = f[i-1][j] + (N*a[i][j]-x)*(N*a[i][j] - x);
            else
                f[i][j] = min(f[i-1][j],f[i][j-1]) + (N*a[i][j]-x)*(N*a[i][j] - x);
        }
        return f[n][m]/N;
}
 
int main()
{
    int T;
    scanf("%d",&T);
    for(int i = 1; i <= T; i++)
    {
        scanf("%d%d",&n,&m);
        for(int k = 1; k <= n; k++)
            for(int j = 1; j <= m; j++)
            {
                scanf("%d",&a[k][j]);
            }
        int ans = 10000000;
        for(int k = 1; k <= 2000; k++)
        {
            ans = min(ans,fin(k));
        }
        printf("Case #%d: %d\n",i,ans);
    }
}

  


ps.我们需要的仅仅是不停找借口让自己坚持下去











 

posted @   Przz  阅读(258)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
阅读排行:
· DeepSeek V3 两周使用总结
· 回顾我的软件开发经历(1)
· C#使用yield关键字提升迭代性能与效率
· 低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解
· 4. 使用sql查询excel内容
点击右上角即可分享
微信分享提示