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 }