题意:有一个n*n的棋盘,不穿越棋盘对角线,求从(0,0)到(n,n)的路径总数
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2067
思路:棋盘dp,递推过程,dp[i][j] = dp[i-1][j] + dp[i][j-1]
注意点:因为n较大,导致dp超出ll范围,用大数即可
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
12680067 | 2015-01-11 09:25:31 | Accepted | 2067 | 0MS | 1772K | 2567 B | G++ | luminous11 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double pi = acos(-1);
string add ( string a, string b )
{
int ans[1000] = { 0 };
string str;
reverse ( all(a) );
reverse ( all(b) );
int len = max ( a.size(), b.size() );
if ( len == a.size() ){
b.resize( len, '0' );
}
else{
a.resize( len, '0' );
}
int tmp = 0;
for ( int i = 0; i < len; i ++ ){
ans[i] = a[i]- '0' + b[i] - '0' + tmp;
tmp = ans[i] / 10;
ans[i] %= 10;
}
if ( tmp != 0 ){
ans[len] = tmp;
len += 1;
}
str.resize( len, '0' );
int cnt = 0;
for ( int i = len - 1; i >= 0; i -- ){
str[cnt++] = ans[i] + '0';
}
return str;
}
string muti ( string a, int b )
{
int ans[1000] = { 0 };
reverse ( all(a) );
int len = a.size();
int tmp = 0;
for ( int i = 0; i < len; i ++ ){
ans[i] = a[i] - '0';
ans[i] = ans[i] * b + tmp;
tmp = ans[i] / 10;
ans[i] %= 10;
}
string str;
if ( tmp != 0 ){
ans[len] = tmp;
len += 1;
}
str.resize( len, '0' );
int cnt = 0;
for ( int i = len - 1; i >= 0; i -- ){
str[cnt++] += ans[i];// + '0';
}
return str;
}
int main()
{
ios::sync_with_stdio( false );
int n;
string num[40][40];
for ( int i = 0; i < 40 ; i ++ ){
for ( int j = 0; j < 40; j ++ ){
num[i][j] = "0";
}
}
for ( int i = 0; i <= 35; i ++ ){
num[0][i] = "1";
}
for ( int i = 1; i <= 35; i ++ ){
for ( int j = i; j <= 35; j ++ ){
num[i][j] = add ( num[i-1][j], num[i][j-1] );
}
}
int cnt = 1;
while ( cin >> n && n != -1 ){
cout << cnt++ << ' ' << n << ' ' << muti ( num[n][n], 2 ) << endl;
}
return 0;
}