【jzoj】【提高】过河卒(无马)答案

这是一个使用动态规划解决的问题,棋盘上过河卒从左上角到右下角的路径数量。初始化棋盘边缘的单元格,然后通过累加相邻单元格的值来填充整个棋盘,最后得到右下角的数值即为路径数。程序使用C++编写,处理了高精度计算的问题。
摘要由CSDN通过智能技术生成

题目描述

有一n行,m列的棋盘,棋盘左上角有一个过河卒,需要走到右下角点处。卒行走规则:可以向下、或者向右。现在要求你计算出卒从左上角点能够到达右下角点的路径的条数。

输入

一行,为n m。(2≤n,m≤100)

输出

一个整数(路径的条数)。

这是高精度的

有点烦。。。

AC代码:

#include <bits/stdc++.h>
using namespace std;
int n, m;
struct node{
	int num[110];	//最低位(个位)存在num[1] 
	int length;
}ans[110][110];
node operator + (node x, node y)
{
	node c;
	c.length=max(x.length, y.length);
	memset(c.num, 0, sizeof(c.num));
	for(int i=1; i<=c.length; ++i){
		c.num[i]+=x.num[i]+y.num[i];
		if(c.num[i]>=10){
			c.num[i+1]+=c.num[i]/10;
			c.num[i]%=10;
		}
	} 
	if(c.num[c.length+1]){
		c.length++;
	}
	return c;
}
int main()
{
    scanf("%d %d", &n, &m);
    for(int i=1; i<=n; ++i){
    	ans[i][1].num[1]=1;
    	ans[i][1].length=1;
	}
	for(int i=1; i<=m; ++i){
    	ans[1][i].num[1]=1;
    	ans[1][i].length=1;
	}
    for(int i=2; i<=n; ++i){
    	for(int j=2; j<=m; ++j){
    		ans[i][j]=ans[i-1][j]+ans[i][j-1];
		}
	}
	for(int i=ans[n][m].length; i>=1; --i){
		printf("%d", ans[n][m].num[i]);	
	}
    return 0;
}

大概就是这样的了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值