題目連接:http://acm.hdu.edu.cn/showproblem.php?pid=5492php
題目大意是有一個矩陣,從左上角走到右下角,每次能向右或者向下,把通過的數字記下來,找出一條路徑是這些數的方差最小。ios
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 961 Accepted Submission(s): 431
ide
1 #include <iostream> 2 #include <cstring> 3 #define inf 0x3f3f3f3f 4 using namespace std; 5 6 int mi(int x,int y) 7 { 8 if (x<y) 9 return x; 10 else 11 return y; 12 } 13 int ans,t,n,m,dp[35][35][1805],a[35][35]; 14 int main() 15 { 16 17 cin>>t; 18 for (int cas=1;cas<=t;cas++) 19 { 20 cin>>n>>m; 21 for (int i=1;i<=n;i++) 22 for (int j=1;j<=m;j++) 23 cin>>a[i][j]; 24 25 memset(dp,inf,sizeof(dp)); 26 dp[0][1][0]=0; 27 dp[1][0][0]=0; 28 29 for (int i=1;i<=n;i++) 30 { 31 for (int j=1;j<=m;j++) 32 { 33 for (int k=0;k<=1800;k++) 34 { 35 if (dp[i-1][j][k]!=inf) 36 { 37 dp[i][j][k+a[i][j]]=mi(dp[i][j][k+a[i][j]],dp[i-1][j][k]+a[i][j]*a[i][j]); 38 } 39 if (dp[i][j-1][k]!=inf) 40 { 41 dp[i][j][k+a[i][j]]=mi(dp[i][j][k+a[i][j]],dp[i][j-1][k]+a[i][j]*a[i][j]); 42 } 43 } 44 } 45 } 46 ans=inf; 47 for (int i=0;i<=1800;i++) 48 { 49 if (dp[n][m][i]!=inf) 50 ans=mi(ans,dp[n][m][i]*(n+m-1)-i*i); 51 } 52 cout <<"Case #"<<cas<<": "<<ans<<endl; 53 } 54 return 0; 55 }