c语言,填空提,给个结果就行

小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 到 9 之间的数字。
  174094882455171152761423221685761892795431233411387427793198
  650286024865090061389344606618496378829135984076361542097372
  601657541200146071777733599818266038012509478351201640618984
  143988087783837107349651099683484992553337438088068198972282
  890781586124258626539246182119762952003918195325258677229419
  698255491250839396799769357665825441616335532825361862146291
  503649293440596342887581257444442930778730382520372975343211
  325351222640703400531067500454956482168314849207060705673849
  265774579830223671554026061117300483012903885770893074783710
  083450145620356667677191627276513995926532444279237315785832
  411595106453089134746365281031552217482363035280722591085079
  053410485925413958279617719034175332412908745680774313630190
  429314820559328748143552689295945058801322270313370955837837
  939182801848609300876356583948397645861551964542532682663945
  625356614462682551015176002433628234343684739800880514363921
  982340231989891351425389287014819359798014755509282450440511
  590838726938103384801541373585690893606978941566666714061214
  952341523168827712604946036245881214982452998386986623826275
  782780208928205527678781609589000725521486468983551558405472
  149903035076783644195574734088152324666290493119955560594634
  905391288186024902215444250421277955403412298227858394469856
  607272647132163832860126054679347881638761723785858733108109
  249157334220127702410373959720286708183036202841837581704881
  367895556630088230650972282944827258473951902831431040790814
  079538232104075905120989173307660289899942087873076421916033
  622143260549608274076012938515668898707915863945382394851328
  164677964192631597026176253407553188801750590935427267220117
  591817866992665840378311257621611574856498432538327068011953
  631534031790352912617015229051836886166704989498756486878095
  690013558017746707412183571476823027885971347137127534455141
  现在小蓝想从这个矩阵的第一行第一列画一条折线到第 30 行 60 列,线只能沿水平向右走或竖直向下走,只能在有数字的地方拐弯。小蓝想知道,这样一条线经过的数字的和最大是多少。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

动态规划


public class HelloWorld {
     public static void main(String []args) {
        String[] str={"174094882455171152761423221685761892795431233411387427793198",
  "650286024865090061389344606618496378829135984076361542097372",
  "601657541200146071777733599818266038012509478351201640618984",
  "143988087783837107349651099683484992553337438088068198972282",
  "890781586124258626539246182119762952003918195325258677229419",
  "698255491250839396799769357665825441616335532825361862146291",
  "503649293440596342887581257444442930778730382520372975343211",
  "325351222640703400531067500454956482168314849207060705673849",
  "265774579830223671554026061117300483012903885770893074783710",
  "083450145620356667677191627276513995926532444279237315785832",
  "411595106453089134746365281031552217482363035280722591085079",
  "053410485925413958279617719034175332412908745680774313630190",
  "429314820559328748143552689295945058801322270313370955837837",
  "939182801848609300876356583948397645861551964542532682663945",
  "625356614462682551015176002433628234343684739800880514363921",
  "982340231989891351425389287014819359798014755509282450440511",
  "590838726938103384801541373585690893606978941566666714061214",
  "952341523168827712604946036245881214982452998386986623826275",
  "782780208928205527678781609589000725521486468983551558405472",
  "149903035076783644195574734088152324666290493119955560594634",
  "905391288186024902215444250421277955403412298227858394469856",
  "607272647132163832860126054679347881638761723785858733108109",
  "249157334220127702410373959720286708183036202841837581704881",
  "367895556630088230650972282944827258473951902831431040790814",
  "079538232104075905120989173307660289899942087873076421916033",
  "622143260549608274076012938515668898707915863945382394851328",
  "164677964192631597026176253407553188801750590935427267220117",
  "591817866992665840378311257621611574856498432538327068011953",
  "631534031790352912617015229051836886166704989498756486878095",
  "690013558017746707412183571476823027885971347137127534455141" };
         int[][] arr=new int[30][60];
         int[] b=new int[60];
         for(int i=0;i<30;i++){
            String num=str[i];
             for(int j=0;j<60;j++){
                arr[i][j]=num.charAt(j)-'0';
                if(i==0 ){
                    if(j==0){
                        b[j]=arr[i][j];
                    }else{
                        b[j]=arr[i][j]+b[j-1];
                    }
                }
            }
         }
        
        for(int i=0;i<29;i++){
            for(int j=0;j<60;j++){
                if(j==0||j==59){//一条直线
                    b[j]+=arr[i+1][j];
                }else  if(b[j]>=b[j-1]){
                    b[j]+=arr[i+1][j];
                }else{
                    b[j]=b[j-1]+arr[i+1][j];     
                }
            }
        }
         int max=0;
        for(int i=0;i<60;i++){
            for(int j=i;j<60;j++){
                b[i]+=arr[29][j];
            }
            if(max<b[i]){
                max=b[i];
            }
        }
         System.out.print("最大值为"+max+"\n");//输出为“最大值为595”
    }
}

递归求解,写了个代码,但是,运行时间太长了,没出来结果。。。供参考吧

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

#define ROW 30
#define COL 60

int count(const char a[][COL+1], int xstart = 0, int ystart = 0)
{
    //printf("%d %d\n", xstart, ystart);
    if (xstart == ROW - 1 && ystart == COL - 1)
        return (a[xstart][ystart] - '0');
    else if (xstart == ROW - 1) //只能往右走
    {
        int s = 0;
        for (int j = ystart; j < COL; j++)
            s += a[xstart][j] - '0';
        return s;
    }else if (ystart == COL - 1) //只能往下走
    {
        int s = 0;
        for (int j = xstart; j < ROW; j++)
            s += a[j][ystart] - '0';
        return s;
    }else
    {
        int n1 = 0, n2 = 0;
        n1 = (a[xstart][ystart] - '0') + count(a, xstart, (ystart + 1)); //向右走
        n2 = (a[xstart][ystart] - '0') + count(a, (xstart + 1), ystart); //向下走
        if (n1 > n2)
            return n1;
        else
            return n2;
        
    }
}

int main()
{
    const char nmb[ROW][COL+1] = {
  "174094882455171152761423221685761892795431233411387427793198",
  "650286024865090061389344606618496378829135984076361542097372",
  "601657541200146071777733599818266038012509478351201640618984",
  "143988087783837107349651099683484992553337438088068198972282",
  "890781586124258626539246182119762952003918195325258677229419",
  "698255491250839396799769357665825441616335532825361862146291",
  "503649293440596342887581257444442930778730382520372975343211",
  "325351222640703400531067500454956482168314849207060705673849",
  "265774579830223671554026061117300483012903885770893074783710",
  "083450145620356667677191627276513995926532444279237315785832",
  "411595106453089134746365281031552217482363035280722591085079",
  "053410485925413958279617719034175332412908745680774313630190",
  "429314820559328748143552689295945058801322270313370955837837",
  "939182801848609300876356583948397645861551964542532682663945",
  "625356614462682551015176002433628234343684739800880514363921",
  "982340231989891351425389287014819359798014755509282450440511",
  "590838726938103384801541373585690893606978941566666714061214",
  "952341523168827712604946036245881214982452998386986623826275",
  "782780208928205527678781609589000725521486468983551558405472",
  "149903035076783644195574734088152324666290493119955560594634",
  "905391288186024902215444250421277955403412298227858394469856",
  "607272647132163832860126054679347881638761723785858733108109",
  "249157334220127702410373959720286708183036202841837581704881",
  "367895556630088230650972282944827258473951902831431040790814",
  "079538232104075905120989173307660289899942087873076421916033",
  "622143260549608274076012938515668898707915863945382394851328",
  "164677964192631597026176253407553188801750590935427267220117",
  "591817866992665840378311257621611574856498432538327068011953",
  "631534031790352912617015229051836886166704989498756486878095",
  "690013558017746707412183571476823027885971347137127534455141" };
    int cnt = count(nmb, 0, 0);
    printf("%d", cnt);
    return 0;
}