Hdu1876 机器人系列2

    技术2026-06-06  6

    机器人系列2

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 768    Accepted Submission(s): 125

    Problem Description

    这又是一个简单的游戏,你控制一个机器人从一个棋盘的起始点(1,1) 走到棋盘的终点 (n,m) 。游戏的规则描述如下: 1.机器人一开始在棋盘的起始点 (1,1) 并有起始点所标有的能量。 2.机器人只能向右或者向下走,并且每走一步消耗一单位能量。 3.只有当机器人消耗完能量时才能获得相应格子上的能量。 请问机器人到达终点的过程中最多有几次完全消耗完能量,消耗完这么多次能量的方式有几种。

    Input

    输入 第一行输入一个整数T, 表示数据的组数。 对于每一组数据第一行输入两个整数n,m(1 <= n,m <= 100) 。表示棋盘的大小。接下来输入 n , 每行 m 个整数 e(0 <= e < 20)

    Output

    请问机器人到达终点的过程中最多有几次完全消耗完能量,消耗完这么多次能量的方式有几种。

    Sample Input

    6 6 

    4 5 6 6 4 3 

    2 2 3 1 7 2 

    1 1 4 6 2 7 

    5 8 4 3 9 5 

    7 6 6 2 1 5 

    3 1 1 3 7 2

    Sample Output

    3 4

    Author

    xhd

     

    这题让人很抓狂……交了不知道多少次才过

    从前往后找,类似dp 的方法拓展出到达每个位置正好没有能量到的最大补充能量次数和方法数,最后再统计

    1 int 是显然会超的……

    2:给的能量会为 0 ,如果能量在终点处为 0 ,那么要特别讨论一下……

    3:一定要判断你找到的那个补充能量的最大次数的方法到底能不能抵达终点……

    我分别在这三个地方摔了……orz ……

     

    #include <stdio.h> __int64 map[105][105]; __int64 dp[105][105]; __int64 cnt[105][105]; void Test(__int64 n,__int64 m) { __int64 i,j; printf("/n"); for (i=0;i<n;i++) { for (j=0;j<m;j++) { printf("%I64d ",cnt[i][j]); } printf("/n"); } } int Dis(int x1,int y1,int x2,int y2) { return y2-y1+x2-x1; } int main() { __int64 i,j,T,n,m,k; scanf("%I64d",&T); while(T--) { scanf("%I64d%I64d",&n,&m); for (i=0;i<n;i++) { for (j=0;j<m;j++) { scanf("%I64d",&map[i][j]); } } for (i=0;i<n;i++) { for (j=0;j<m;j++) { dp[i][j]=0; cnt[i][j]=0; } } dp[0][0]=1; cnt[0][0]=0; for (i=0;i<n;i++) { for (j=0;j<m;j++) { if (dp[i][j]==0 || map[i][j]==0) continue; for (k=0;k<=map[i][j];k++) { if (i+k<n && j+map[i][j]-k<m) { if (cnt[i+k][j+map[i][j]-k]<cnt[i][j]+1) { dp[i+k][j+map[i][j]-k]=dp[i][j]; cnt[i+k][j+map[i][j]-k]=cnt[i][j]+1; } else if (cnt[i+k][j+map[i][j]-k]==cnt[i][j]+1) { dp[i+k][j+map[i][j]-k]+=dp[i][j]; } } // Test(n,m); } } } __int64 s=0; __int64 p=0; for (i=0;i<n;i++) { for (j=0;j<m;j++) { if (s<cnt[i][j] && (map[i][j]!=0 || (i==n-1 && j==m-1)) && Dis(i,j,n-1,m-1)<=map[i][j]) { s=cnt[i][j]; p=dp[i][j]; } else if (s==cnt[i][j] && (map[i][j]!=0 || (i==n-1 && j==m-1)) && Dis(i,j,n-1,m-1)<=map[i][j]) { p=p+dp[i][j]; } } } printf("%I64d %I64d/n",s,p); } return 0; }

    最新回复(0)