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
",sqrt(an));
74     }
75     return 0;
76 }
View Code

下面那个不是 贴错了

 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
",dp[m][n-1]);
38     return 0;
39 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3262839.html