国际象棋中的车可以水平的或竖直的移动,一个车要从一个棋盘的一角移到对角线的另一角,有多少种最短路径?
a,用动态规划算法求解
a,用动态规划算法求解
b,用初等排列组合知识求解
题目参考:http://www.cnblogs.com/brokencode/archive/2011/06/26/2090702.html
B方法高中就知道了,最后结果c[2n][n],编程方法可以参照动态规划学习一 http://blog.csdn.net/midle110/article/details/7471361
这里主要介绍第一种方法
想要得到 a[n][n] ,反推,由于不能回走,所以a[n][n]只能是a[n-1][n]和a[n][n-1]这两个路径走过来
也就是 a[n][n] = a[n-1][n] + a[n][n-1]
就这样,思路就出来了
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int a[104][104];
int s;
while (cin>>s)
{
memset(a , 0 , sizeof(a));
for (int i = 0 ; i <= 100 ; ++i )
{
a[0][i] = 1 ;
a[i][0] = 1 ;
}
for ( i = 1; i <= 100 ; ++i )
{
for (int j = 1 ; j <= 100 ; ++j )
{
a[i][j] = a[i-1][j] + a[i][j -1 ];
}
}
cout<<a[s][s]<<endl;
}
return 0;
}