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 } 

posted on 2012-08-22 11:37  mycapple  阅读(521)  评论(0编辑  收藏  举报

导航