NYOJ 171 聪明的kk (dp问题)

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=171

思路:dp问题,不过要注意开始的时候下表要考虑好,我是让d[][] 的四周空出一行,这样就不会出错了

代码如下:

 1 #include<stdio.h>

 2 #include<stdlib.h>

 3 #include<string.h>

 4 int i,j,N,M;

 5 int map[25][25],d[25][25];

 6 int dp(int N,int M)

 7 {

 8     memset(d,0,sizeof(d));

 9     for(i=0;i<N;i++) 

10     for(j=0;j<M;j++)

11     if(d[i+1][j]>d[i][j+1])  //即(i,j)位置的下面一个位置(i+1,j)的虫子个数大于(i,j)位置的右面的一个位置(i,j+1)

12         d[i+1][j+1]=d[i+1][j]+map[i+1][j+1];  //这点不太懂。。。

13     else

14         d[i+1][j+1]=d[i][j+1]+map[i+1][j+1];

15     return d[N][M] ;

16 }

17 int main()

18 {

19     scanf("%d%d",&N,&M);

20     for(i=1;i<=N;i++)

21     for(j=1;j<=M;j++)

22     scanf("%d",&map[i][j]);

23     printf("%d\n",dp(N,M));

24     system("pause");

25     return 0;

26 }

 

借鉴代码如下:

 1 #include<iostream>

 2 #include<cstring>

 3 using namespace std;

 4 int dp[25][25];

 5 int main()

 6 {

 7     int i,j,m,n;

 8     cin>>m>>n;

 9     memset(dp,0,sizeof(dp));

10     for(i=1;i<=m;i++)

11     {

12         for(j=1;j<=n;j++)

13         {

14             cin>>dp[i][j];

15         }

16     }

17     for(i=1;i<=m;i++)

18     {

19         for(j=1;j<=n;j++)

20         {

21             dp[i][j]=dp[i][j]+max(dp[i-1][j],dp[i][j-1]);//这点表示不太懂,正在研究。。。

22         }

23     }

24     cout<<dp[m][n]<<endl;

25     system("pause");

26     return 0;

27 } 

你可能感兴趣的:(dp)