poj棋盘分割(记忆化)
http://poj.org/problem?id=1191
黑书上P116 想了挺久 没想出来 想推出一公式来着 退不出来。。
想偏了 正解:递归
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<stdlib.h> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 #define INF 0xfffffff 9 #define LL long long 10 int dp[20][10][10][10][10]; 11 int aa[10][10],n; 12 int divide(int k,int a,int b,int c,int d) 13 { 14 int i,j,minz = INF,g; 15 if(dp[k][a][b][c][d]) 16 return dp[k][a][b][c][d]; 17 if(k==n) 18 { 19 int s = 0; 20 for(i = a; i <= c ; i++) 21 for(j = b ; j <= d ; j++) 22 s+=aa[i][j]; 23 dp[k][a][b][c][d] = s*s; 24 return s*s; 25 } 26 for(i = a+1 ; i <= c ; i++) 27 { 28 int s = 0; 29 for(g = i ; g <= c ; g++) 30 for(j = b ; j <= d ; j++) 31 s+=aa[g][j]; 32 minz = min(minz,s*s+divide(k+1,a,b,i-1,d)); 33 s = 0; 34 for(g = a ; g <= i-1 ; g++) 35 for(j = b ; j <= d ; j++) 36 s+=aa[g][j]; 37 minz = min(minz,s*s+divide(k+1,i,b,c,d)); 38 } 39 for(i = b+1 ; i <= d ; i++) 40 { 41 int s = 0; 42 for(g = a ; g <= c ; g++) 43 for(j = i ; j <= d ; j++) 44 s+=aa[g][j]; 45 minz = min(minz,s*s+divide(k+1,a,b,c,i-1)); 46 s = 0; 47 for(g = a ; g <= c ; g++) 48 for(j = b ; j <= i-1 ; j++) 49 s+=aa[g][j]; 50 minz = min(minz,s*s+divide(k+1,a,i,c,d)); 51 } 52 dp[k][a][b][c][d] = minz; 53 return minz; 54 } 55 int main() 56 { 57 int i,j; 58 while(scanf("%d",&n)!=EOF) 59 { 60 double s=0; 61 memset(dp,0,sizeof(dp)); 62 int m = 8; 63 n--; 64 for(i = 1; i <= m ;i++) 65 for(j = 1; j <= m ; j++) 66 { 67 scanf("%d",&aa[i][j]); 68 s+=double(aa[i][j]); 69 } 70 s = s/double(n+1); 71 int ans = divide(0,1,1,m,m); 72 double an = 1.0/double(n+1)*double(ans)-s*s; 73 printf("%.3lf\n",sqrt(an)); 74 } 75 return 0; 76 }
下面那个不是 贴错了
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<stdlib.h> 5 #define N 5010 6 #define M 3010 7 #define INF 0xfffffff 8 using namespace std; 9 int dp[M][N],h[N]; 10 int main() 11 { 12 int i,j,n,m,g; 13 scanf("%d%d",&m,&n); 14 for(i = 1; i <= n ;i++) 15 scanf("%d",&h[i]); 16 for(i = 1; i <= m ;i++) 17 for(j = 1; j <= n ;j++) 18 dp[i][j] = INF; 19 int o = INF; 20 for(i = 2 ; i < n ;i++) 21 { 22 dp[1][i] = min(o,(h[i]-h[i-1])*(h[i]-h[i-1])); 23 o = min(dp[1][i],o); 24 } 25 for(i = 2 ; i <= m ; i++) 26 { 27 int o = INF; 28 for(j = 2*i ; j < n-(m-i)*3 ;j++) 29 { 30 if(j-2<(n-(m-i+1)*3)) 31 dp[i][j] = min(o,dp[i-1][j-2]+(h[j]-h[j-1])*(h[j]-h[j-1])); 32 else 33 dp[i][j] = min(o,dp[i-1][j-3]+(h[j]-h[j-1])*(h[j]-h[j-1])); 34 o = min(o,dp[i][j]); 35 } 36 } 37 printf("%d\n",dp[m][n-1]); 38 return 0; 39 }