zoukankan      html  css  js  c++  java
  • NOI1999 JZYZOJ1289 棋盘分割 dp 方差的数学结论

    http://172.20.6.3/Problem_Show.asp?id=1289

    除了下标一坨一坨屎一样挺恶心其他都还挺容易的dp,这道题才发现scanf保留小数位是四舍五入的,惊了。
    f[k][x1][y1][x2][y2]
    嗯写的时候猜错结论了,本来以为是求下属分配方案中平方和与平均数平方*k的差最小的方案赋给f,没想到是直接找最小的。
    代码
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 using namespace std;
     8 int n;
     9 int a[10][10]={};
    10 double f[20][10][10][10][10]={};
    11 bool vis[20][10][10][10][10]={};
    12 int main(){
    13     scanf("%d",&n);
    14     for(int i=1;i<=8;i++){
    15         for(int j=1;j<=8;j++){
    16             scanf("%d",&a[i][j]);
    17             a[i][j]+=a[i][j-1];
    18             a[i][j]+=a[i-1][j];
    19             a[i][j]-=a[i-1][j-1];
    20         }
    21     }
    22     for(int i=1;i<=8;i++){
    23         for(int j=1;j<=8;j++){
    24             for(int w=i;w<=8;w++){
    25                 for(int q=j;q<=8;q++){
    26                     f[1][i][j][w][q]=1.0*(a[w][q]-a[i-1][q]-a[w][j-1]+a[i-1][j-1]);
    27                     f[1][i][j][w][q]*=f[1][i][j][w][q];vis[1][i][j][w][q]=1;
    28                 }
    29             }
    30         }
    31     }
    32     double ro=1.0*a[8][8]/(1.0*n);
    33     ro=ro*ro;
    34     for(int k=2;k<=n;k++){
    35         for(int i=1;i<=8;i++){
    36             for(int j=1;j<=8;j++){
    37                 for(int w=i;w<=8;w++){
    38                     for(int q=j;q<=8;q++){
    39                         for(int z=i;z<w;z++){
    40                             if((vis[k-1][i][j][z][q]&&vis[1][z+1][j][w][q])&&(vis[k][i][j][w][q]==0||f[k][i][j][w][q]-(f[k-1][i][j][z][q]+f[1][z+1][j][w][q])>0)){
    41                                 f[k][i][j][w][q]=f[k-1][i][j][z][q]+f[1][z+1][j][w][q];vis[k][i][j][w][q]=1;
    42                             }
    43                             if((vis[1][i][j][z][q]&&vis[k-1][z+1][j][w][q])&&(vis[k][i][j][w][q]==0||f[k][i][j][w][q]-(f[1][i][j][z][q]+f[k-1][z+1][j][w][q])>0)){
    44                                 f[k][i][j][w][q]=f[1][i][j][z][q]+f[k-1][z+1][j][w][q];vis[k][i][j][w][q]=1;
    45                             }
    46                         }
    47                         for(int z=j;z<q;z++){
    48                             if((vis[k-1][i][j][w][z]&&vis[1][i][z+1][w][q])&&(vis[k][i][j][w][q]==0||f[k][i][j][w][q]-(f[k-1][i][j][w][z]+f[1][i][z+1][w][q])>0)){
    49                                 f[k][i][j][w][q]=f[k-1][i][j][w][z]+f[1][i][z+1][w][q];vis[k][i][j][w][q]=1;
    50                             }
    51                             if((vis[1][i][j][w][z]&&vis[k-1][i][z+1][w][q])&&(vis[k][i][j][w][q]==0||f[k][i][j][w][q]-(f[1][i][j][w][z]+f[k-1][i][z+1][w][q])>0)){
    52                                 f[k][i][j][w][q]=f[1][i][j][w][z]+f[k-1][i][z+1][w][q];vis[k][i][j][w][q]=1;
    53                             }
    54                         }
    55                     }
    56                 }
    57             }
    58         }
    59     }
    60     double z=f[n][1][1][8][8]/n-ro;
    61     z=sqrt(z);
    62     printf("%.3f
    ",z);
    63     return 0;
    64 }
    View Code
  • 相关阅读:
    Angular JS 学习之 Scope作用域
    PHP变量
    AngularJS学习之模型
    Angular JS学习之指令
    Angular JS学习之表达式
    Angular JS 学习之简介
    HTML DOM学习之三
    HTML DOM学习之二
    HTML DOM学习之一
    《集体智慧编程》第一章
  • 原文地址:https://www.cnblogs.com/137shoebills/p/7786974.html
Copyright © 2011-2022 走看看