1411261432-ny-AB Problem II

部署运行你感兴趣的模型镜像

A*B Problem II

时间限制:1000 ms  |  内存限制:65535 KB
难度:1
描述
ACM的C++同学有好多作业要做,最头痛莫过于线性代数了,因为每次做到矩阵相乘的时候,大量的乘法都会把他搞乱,所以他想请你写个程序帮他检验一下计算结果是否正确。
输入
有多组测试数据,每行给出一组m,n,k(0<m,n,k<=50)。m,n,k表示两个矩阵的大小,其中:
矩阵A:m行n列。
矩阵B:n行k列。
接下来给出m*n个数表示矩阵A和n*k个数表示矩阵B,对于每个数s,0<=s<=1000。
当m,n,k同时为0时结束。
输出
计算两个矩阵的乘积并输出。
样例输入
2 1 3
1
2
1 2 3
2 2 3
1 2
3 4
1 0 1
0 1 0
0 0 0
样例输出



1 2 3
2 4 6
1 2 1
3 4 3

解题思路

       这个是考验三重for循环的内部排序问题,思考到底是哪个是外层循环,哪个是内层循环。

代码

#include<stdio.h>
#include<string.h>
int a[60][60],b[60][60],c[60][60];
int main()
{
	int m,n,k;
	int i,j,d;
	while(scanf("%d%d%d",&m,&n,&k),m+n+k)
	{
		for(i=1;i<=m;i++)
		    for(j=1;j<=n;j++)
		        scanf("%d",&a[i][j]);
		for(i=1;i<=n;i++)
		    for(j=1;j<=k;j++)
		        scanf("%d",&b[i][j]);
		memset(c,0,sizeof(c));
		for(i=1;i<=m;i++)
		    for(j=1;j<=k;j++)
		        for(d=1;d<=n;d++)//主要是三重for循环的排序问题
		//因为得到的是c[m][k];
		//所以m,k,n 
		            c[i][j]+=a[i][d]*b[d][j];
		for(i=1;i<=m;i++)
		{
		    for(j=1;j<=k;j++)
		    {
		    	printf("%d",c[i][j]);
		    	if(j!=k)
		    	    printf(" ");
		    }
		    printf("\n");
		}
	}
	return 0;
} 


例:

    矩阵A * B

3 5 1 2 3 4

0 1 * = ??

4 2 5 6 7 8

c(i,j)=a的第i行*b的第j列

   得到的是3*4的距阵啊,很简单的算术问题。3*1+5*5=28,得到是是第一行第一列的数值,3*2+5*6=36,得到是是第一行第二列的数值,3*3+5*7=44,得到是是第一行第三列的数值,3*4+5*8=52,得到是是第一行第四列的数值,这是第一行的四个数,。第二行第一列的数值是0*1+1*5=5,第二行第二列的数值是0*2+1*6=6,第二行第三列的数值是0*3+1*7=7,第二行第四列的数值是0*4+1*8=8,这是第二行的四个数值。第三行第一列的数值是4*1+2*5=14,第三行第二列的数值是4*2+2*6=20,第三行第三列的数值是4*3+2*7=26,第三行第四列的数值是4*4+2*8=32,第三行的四个数。得到的结果是

28 36 44 52

5 6 7 8    

14 20 26 32


您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

# P4363 [九省联考 2018] 一双木棋 chess ## 题目描述 菲菲牛牛在一块 $n$ 行 $m$ 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。 落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子。 棋盘的每个格子上,都写有两个非负整数,从上到下第 $i$ 行中从左到右第 $j$ 列的格子上的两个整数记作 $a_{i,j}$ $b_{i,j}$。 在游戏结束后,菲菲牛牛会分别计算自己的得分:菲菲的得分是所有有黑棋的格子上的 $a_{i,j}$ 之,牛牛的得分是所有有白棋的格子上的 $b_{i,j}$ 的。 菲菲牛牛都希望,自己的得分减去对方的得分得到的结果最大。现在他们想知道,在给定的棋盘上,如果双方都采用最优策略且知道对方会采用最优策略,那么,最终的结果如何? ## 输入格式 第一行有两个整数,分别表示棋盘的行数 $n$ 列数 $m$。 第 $2$ 到第 $(n + 1)$ 行,每行 $m$ 个整数,第 $(i + 1)$ 行的第 $j$ 个整数表示 $a_{i, j}$。 第 $(n + 2)$ 到第 $(2n + 1)$ 行,每行 $m$ 个整数,第 $(n + i + 1)$ 行的第 $j$ 个整数表示 $b_{i, j}$。 ## 输出格式 输出一行一个整数,表示菲菲的得分减去牛牛的得分的结果。 ## 输入输出样例 #1 ### 输入 #1 ``` 2 3 2 7 3 9 1 2 3 7 2 2 3 1 ``` ### 输出 #1 ``` 2 ``` ## 说明/提示 ### 样例 1 说明 ![](https://cdn.luogu.com.cn/upload/pic/16877.png) 棋盘如图所示,双方都采用最优策略时,棋局如下: - 菲菲下在第 $1$ 行第 $1$ 列(这是第一步时唯一可以落子的格子)。 - 牛牛下在第 $1$ 行第 $2$ 列。 - 菲菲下在第 $2$ 行第 $1$ 列。 - 牛牛下在第 $1$ 行第 $3$ 列。 - 菲菲下在第 $2$ 行第 $2$ 列。 - 牛牛下在第 $2$ 行第 $3$ 列(这是这一步时唯一可以落子的格子)。 - 填满棋盘,游戏结束。 盘面如下: ![](https://cdn.luogu.com.cn/upload/pic/16878.png) 菲菲的得分为 $2 + 9 + 1 = 12$,牛牛的得分为 $7 + 2 + 1 = 10$。 ### 数据规模与约定 各测试点信息如下表。 ![](https://cdn.luogu.com.cn/upload/pic/16879.png) - 对于编号为奇数的测试点,保证 $b_{i, j} = 0$。 - 对于全部的测试点,保证 $1 \leq n, m \leq 10$,$0 \leq a_{i, j}, b_{i, j} \leq 10^5$。 思路:先写m个0,然后看每一行,有几个棋子就在第几个0后面插入一个1。为什么WA了 ```cpp #include <iostream> using namespace std; const int INF = 0x3f3f3f3f; const int MAX_N = 15; int n, m, dp[1 << 20]; int a[MAX_N][MAX_N]; int b[MAX_N][MAX_N]; bool first(int s) { int f = 0; for (int j = 0, k = 0; k < n + m; k++) if (s >> k & 1) f ^= j; else j++; return (f & 1) ^ 1; } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> a[i][j]; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> b[i][j]; for (int s = 1 << n; s <= (1 << n) - 1 << m - 1; s++) { if (__builtin_popcount(s) != n) continue; int f = first(s); dp[s] = f ? -INF : INF; bool flag = false; for (int i = 0, j = 0, k = 0; k < n + m; k++) if (s >> k & 1) { i++; if (flag) { int p = s ^ (1 << k) ^ (1 << k - 1); if (f) dp[s] = max(dp[s], dp[p] + a[i][j]); else dp[s] = min(dp[s], dp[p] - b[i][j]); flag = false; } } else j++, flag = true; } cout << dp[(1 << n) - 1 << m - 1] << '\n'; return 0; } ```
最新发布
09-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值