题目大意:在一个r*c的方格中行走,只能向下和向右走,每个格子内有一定的黄金,问能得到的最大黄金数。
AC代码:
View Code
1 #include<stdio.h> 2 #include<string.h> 3 int dp[1002][1002]; 4 int max(int a,int b) 5 { 6 if(a>b)return a; 7 else return b; 8 } 9 int main() 10 { 11 int t; 12 scanf("%d",&t); 13 int w=1; 14 while(t--) 15 { 16 memset(dp,0,sizeof(dp)); 17 int i,j,r,c,a; 18 scanf("%d%d",&r,&c); 19 for(i=1;i<=r;i++) 20 { 21 for(j=1;j<=c;j++) 22 { 23 scanf("%d",&a); 24 dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a; 25 } 26 } 27 printf("Scenario #%d:\n",w++); 28 printf("%d\n\n",dp[r][c]); 29 } 30 return 0; 31 }
ps:虽然过了但是时间有点长。
网上的一个最快的代码:
View Code
1 #include<iostream> 2 using namespace std; 3 int dp[1001][1001]; 4 inline int readdata() 5 { 6 int ret(0); 7 char c; 8 while((c=getchar())<'0'||c>'9'); 9 ret=c-'0'; 10 while((c=getchar())>='0'&&c<='9')ret=ret*10+(c-'0'); 11 return ret; 12 } 13 inline void pridata(int x) 14 { 15 char top[12]; 16 int i(0); 17 if(x==0){putchar('0');return;} 18 while(x) 19 { 20 top[i++]=(x%10)+'0'; 21 x/=10; 22 } 23 while(i--)putchar(top[i]); 24 } 25 int main() 26 { 27 int idx=0; 28 short i,j; 29 short n,m; 30 int tmp; 31 short t; 32 t=readdata(); 33 while(t--) 34 { 35 n=readdata(); 36 m=readdata(); 37 for(i=0;i<n;++i) 38 for(j=0;j<m;++j) 39 dp[i][j]=readdata(); 40 for(i=n-1;i>=0;--i) 41 for(j=m-1;j>=0;--j) 42 { 43 tmp=0; 44 if(j+1<m)tmp=max(tmp,dp[i][j+1]); 45 if(i+1<n)tmp=max(tmp,dp[i+1][j]); 46 if(i+1<n&&j+1<m)tmp=max(tmp,dp[i+1][j+1]); 47 dp[i][j]+=tmp; 48 } 49 printf("Scenario #"); 50 pridata(++idx); 51 putchar(':'); 52 putchar('\n'); 53 pridata(dp[0][0]); 54 putchar('\n'); 55 putchar('\n'); 56 } 57 return 0; 58 }
ps:没看懂!!!!!