矩阵 matrix

 矩阵 matrix

题目描述

给定一个n∗m的矩阵,矩阵中的每个元素aijaij为正整数。
接下来规定:
1.合法的路径初始从矩阵左上角出发,每次只能向右或向下走,终点为右下角。
2.路径经过的n+m−1个格子中的元素为A1,A2…A(n+m−1),Aavg为Ai的平均数,路径的V值为:
(n+m−1)n+m−1∑i=1(Ai−Aavg)2
求V值最小的合法路径。输出V值即可,有多组测试数据。

 

输入

 

第一行包含一个正整数T,表示数据组数。

对于每组数据:

第一行包含两个正整数n和m,表示矩阵的行数和列数。
接下来n行,每行m个正整数aij,描述这个矩阵。

 

输出

 

对于每次询问,输出一行一个整数表示要求的结果

 

样例输入

1
2 2
1 2
3 4

样例输出

14

提示

对于24%的数据 n≤10,m≤10
对于80% T≤5,n≤30,m≤30 矩阵中的元素不大于30
对于另外20%T≤2,n≤50,m≤50


solution

拆开式子

N=n+m-1,S=\sum ai,SS=\sum ai^2

则原式=N*SS-S*S

考虑dp

令f[i][j][k]表示走到(i,j),走过S*S=k的SS的最小值

f[i][j][k]=min(f[i-1][j][k-s[i][j]],f[i][j-1][k-s[i][j]])+s[i][j]*s[i][j];

枚举计算答案即可

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int T,n,m,s[55][55];
long long f[55][55][3505];
int main(){
	cin>>T;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)scanf("%d",&s[i][j]);
		
		for(int i=0;i<=n;i++)
		for(int j=0;j<=m;j++)
		for(int k=0;k<=3500;k++)f[i][j][k]=1e15;
		f[1][1][s[1][1]]=s[1][1]*s[1][1];
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(i==1&&j==1)continue;
			for(int k=s[i][j];k<=3500;k++){
			f[i][j][k]=min(f[i-1][j][k-s[i][j]],f[i][j-1][k-s[i][j]])+1LL*s[i][j]*s[i][j];
			}
		}
		long long ans=1e15;
		for(int i=0;i<=3500;i++){
			ans=min(ans,(n+m-1)*f[n][m][i]-1LL*i*i);
		}
		printf("%lld\n",ans);
	}
    return 0;
}

 

posted @   liankewei123456  阅读(315)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示