收集苹果

来源:互联网 发布:网络桌游平台 编辑:程序博客网 时间:2024/05/05 10:33
问题:

   一个拥有N*M个单元的格子,每一个里面都有着一定数量的苹果,数量已经给定。现在你位于左上角。每一步你可以向下走或者向右走。问你能够收集到最多多少个苹果。

作为比较经典的题目给出几种算法.

最简单的莫过于动态规划了.

#include<iostream>#include<memory.h>using namespace std;int main(){    int a[3][3]={1,2,3,5,6,4,2,1,1};    int s[4][4];    memset(s,0,sizeof(s));     for(int i=0;i<3;i++)    {        for(int j=0;j<3;j++)        {                     if(j==0&&i==0)               s[i][j]=a[i][j];               if(j>0&&i==0)                 s[i][j]=a[i][j]+s[i][j-1];               if(i>0&&j==0)                  s[i][j]=a[i][j]+s[i-1][j];                if(j>0&&i>0)               s[i][j]=a[i][j]+max(s[i][j-1],s[i-1][j]);        }    }        cout<<s[2][2]<<endl;        system("pause");}


dfs的:

#include<iostream>#include<memory.h>#include<algorithm>using namespace std;int origin[3][3]={1,2,3,5,6,4,2,1,1};int ans[100];int xchange[]={0,1};int ychange[]={1,0};int cost[4];int flag=false;int b=0;int num=0;void dfs(int row,int col,int deep){              if(row==2&&col==2)     {                       for(int i=0;i<4;i++)                       {                        ans[num]+=cost[i];                              }                       ans[num]+=origin[row][col];                      num++;         return;     }           for(int i=0;i<2;i++)     {             int new_row=row+xchange[i];             int new_col=col+ychange[i];             if(new_col>=0&&new_col<=2&&new_row>=0&&new_row<=2)                {                      cost[deep]=origin[row][col];                                                                              //ans+=origin[row][col];                                       dfs(new_row,new_col,deep+1);                }                      }    }int main(){        memset(ans,0,sizeof(ans));      dfs(0,0,0);      sort(ans,ans+num);    cout<<ans[num-1]<<endl;    system("pause");          }

还有dijkstra算法也可以,求最短路径,相应地求最长路径也是可以的..代码就不给出了.


原创粉丝点击