hdu5492(递推+数学)

来源:互联网 发布:淘宝网运动鞋女 编辑:程序博客网 时间:2024/05/09 00:47

链接:点击打开链接

题意:给出一个n*m的矩阵,每个点上有权值,求(N+M−1)∑N+M−1i=1(Ai−Aavg)2的最小值

代码:

#include <stdio.h>#include <iostream>#include <stdlib.h>#include <string.h>#include <algorithm>using namespace std;const int INF=0x3f3f3f3f;int a[35][35],dp[35][35][2005];                 //可以把结果*(n+m-1)²就变成了方差int main(){                                     //又因为D(X)=E(x²)-[E(X)]²    int t,n,m,i,j,k,ans,cas;                    //dp[i][j][k]表示走到(i,j)和是k时,平方和最小是多少        scanf("%d",&t);    for(cas=1;cas<=t;cas++){        scanf("%d%d",&n,&m);        for(i=1;i<=n;i++)        for(j=1;j<=m;j++)        scanf("%d",&a[i][j]);        memset(dp,INF,sizeof(dp));        dp[1][1][a[1][1]]=a[1][1]*a[1][1];        for(i=1;i<=n;i++){            for(j=1;j<=m;j++){                for(k=0;k<=2000;k++)            //因为每个格时非负数,所以不能从n+m-1开始推                if(dp[i][j][k]!=INF){                    if(i+1<=n)                    dp[i+1][j][k+a[i+1][j]]=min(dp[i+1][j][k+a[i+1][j]],dp[i][j][k]+a[i+1][j]*a[i+1][j]);                    if(j+1<=m)                    dp[i][j+1][k+a[i][j+1]]=min(dp[i][j+1][k+a[i][j+1]],dp[i][j][k]+a[i][j+1]*a[i][j+1]);                }            }        }        ans=INF;        for(i=0;i<=2000;i++)                            if(dp[n][m][i]!=INF)        ans=min(ans,(n+m-1)*dp[n][m][i]-i*i);        printf("Case #%d: %d\n",cas,ans);    }    return 0;}

0 0
原创粉丝点击