1048: [HAOI2007]分割矩阵——记忆化搜索

本文探讨了一种用于解决大型矩阵问题的高效算法。通过引入动态规划和矩阵求和预处理,该算法显著提高了计算效率。具体实现包括使用C++进行编程,详细解释了从输入到输出的完整流程,并提供了实际案例分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.lydsy.com/JudgeOnline/problem.php?id=1048

TML了一发

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define clr(a,b) memset(a,b,sizeof(a))
const double INF = 0x3f3f3f3f;
using namespace std;
int a[11][11];
int sum[11][11],sumx[11][11],sumy[11][11];
double dp[11][11][11][11][11];
int n,m,k;
double ave;
double solve(int x1,int y1,int x2,int y2,int k)
{
    double &ans=dp[x1][y1][x2][y2][k];
    if(ans>=0.0) return ans;
    if(k==1){
        int t=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
        return ans=(t-ave)*(t-ave);
    }
    ans=INF;
    for(int i=y1;i<y2;++i){
        for(int j=1;j<k;++j){
            ans=min(ans,solve(x1,y1,x2,i,j)+solve(x1,i+1,x2,y2,k-j));
        }
    }
    for(int i=x1;i<x2;++i){
        for(int j=1;j<k;++j){
            ans=min(ans,solve(x1,y1,i,y2,j)+solve(i+1,y1,x2,y2,k-j));
        }
    }
    return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // ONLINE_JUDGE
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            scanf("%d",&a[i][j]);
            sumx[i][j]=sumx[i][j-1]+a[i][j];
            sumy[j][i]=sumy[j][i-1]+a[i][j];
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            sum[i][j]=sum[i-1][j-1]+sumx[i][j-1]+sumy[j][i-1]+a[i][j];
        }
    }
    ave=sum[n][m]*1.0/k;
    clr(dp,0xff);
    double ans=solve(1,1,n,m,k);
    printf("%.2f\n",sqrt(ans/k));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值