zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    SQL 查询中 not in的改进,--not exists
    REST接口--转摘
    C#中@的用法总结(转)
    有感于哈工大matlab被限制使用
    Oracle CURRVAL应用限制
    oracle to_char()函数--数字型到字符型
    如何提交代码到git仓库
    cannot find module 'xxx' 解决办法
    DOM-基本概念及使用
    AJAX-同源策略 跨域访问
  • 原文地址:https://www.cnblogs.com/shangyu/p/3262839.html
Copyright © 2011-2022 走看看