人生成就 |
||
Accepted : 54 | Submit : 104 | |
Time Limit : 10000 MS | Memory Limit : 65536 KB |
题目描述人生就像一个n*n的矩阵,矩阵每个元素都跟上下左右四个方向的元素联通,起始在左上角,终止在右下角,从起点开始,每次一个向右或向下移动一格。 每个元素上面都有一个人生成就值,表示你如果经历这个元素时候能增加的人生成就。 初始时候你的人生成就值为0,你当然想到达终点时候能获得最大的人生成就。那么问题来了:(你一定会以为我会要你求出到达终点时的最大人生成就值,但是你错了),问题就是,一共有多少条不同的路到终点时能达到最大的人生成就。 输入约200个样例 每个样例的第一行为一个整数n(2 ≤ n ≤ 500),表示矩阵大小。以后的n行,每行n个整数cij表示这个矩阵, 0 ≤ cij ≤ 100。 输出每行输出一个整数,最终的结果可能很大,请把结果对123456取模。 样例输入3 0 4 0 2 3 0 4 2 3 4 3 3 3 2 2 0 0 0 2 2 0 0 2 4 4 3 3 3 3 3 3 4 4 4 4 3 样例输出1 2 5 #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #define N 550 using namespace std; int a[N][N],dp[N][N],num[N][N]; int main() { int i,j,n; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); memset(num,0,sizeof(num)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&a[i][j]); } } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { dp[i][j]=max(dp[i-1][j]+a[i][j],dp[i][j-1]+a[i][j]); } } num[1][1]=1; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(a[i][j]==dp[i][j]-dp[i-1][j]) num[i][j]+=num[i-1][j]; if(a[i][j]==dp[i][j]-dp[i][j-1]) num[i][j]+=num[i][j-1]; num[i][j]%=123456; } } printf("%d ",num[n][n]); } return 0; } |