zoukankan      html  css  js  c++  java
  • Find a path HDU

    在矩阵上找1,1到n,m的方差最小的路径
    手推一下公式
    ni=1(xix)2=ni=1x2i(ni=1xi)2
    这样求可以分阶段处理方差了,用dp[x][y][k]表示
    路径走到(x,y)的时候,路径和为k时的最小平方和,对所有减项存最小的被减项(k表示平方和的话第三维太广存不下)

    //#include<bits/stdc++.h>  
    //#pragma comment(linker, "/STACK:1024000000,1024000000")   
    #include<stdio.h>  
    #include<algorithm>  
    #include<queue>  
    #include<string.h>  
    #include<iostream>  
    #include<math.h>  
    #include<set>  
    #include<map>  
    #include<vector>  
    #include<iomanip>  
    using namespace std;  
    
    const double pi=acos(-1.0);  
    #define ll long long  
    #define pb push_back
    
    #define sqr(a) ((a)*(a))
    #define dis(a,b) sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))
    #define FOR(a) for(int i=1;i<=a;i++)
    const double eps=1e-10;
    const int maxn=2e5+56;
    const int inf=0x3f3f3f3f;
    
    int n,m;
    int mp[35][35];
    int dp[35][35][1800];
    
    int main(){
        int kase=0;
        int T;scanf("%d",&T);
        while(T--){
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&mp[i][j]);
            memset(dp,inf,sizeof dp);
            dp[1][1][mp[1][1]]=sqr(mp[1][1]);
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    if(i<n){
                        for(int k=0;k<=59*30;k++)if(dp[i][j][k]!=inf)
                            dp[i+1][j][k+mp[i+1][j]]=min(
                                dp[i+1][j][k+mp[i+1][j]],
                                dp[i][j][k]+sqr(mp[i+1][j])
                                    );
                    }
                    if(j<m){
                        for(int k=0;k<=59*30;k++)if(dp[i][j][k]!=inf)
                            dp[i][j+1][k+mp[i][j+1]]=min(
                                dp[i][j+1][k+mp[i][j+1]],
                                dp[i][j][k]+sqr(mp[i][j+1])
                                    );
    
                    }
                }   
            }
            int ans=inf;
            for(int i=0;i<=59*30;i++){
                if(dp[n][m][i]!=inf)
                    ans=min(ans,(n+m-1)*dp[n][m][i]-i*i);
            }
            printf("Case #%d: %d
    ",++kase,ans);
        }
    }
  • 相关阅读:
    经典8锁问题--助你彻底搞懂锁的概念
    linux上安装mysql
    Jenkins安装详解
    第一篇:实时网络日志分析器和交互式查看器--GoAccess安装
    Centos7上安装python3.7
    Nginx报错收集
    免费yum源镜像地址
    nginx日志文件切割
    腾讯云绑定和配置弹性网卡和添加弹性网卡
    LNMP-WEB应用环境搭建
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611231.html
Copyright © 2011-2022 走看看