zoukankan      html  css  js  c++  java
  • POJ 1191 棋盘分割 (区间DP,记忆化搜索)

    题面

    思路:分析公式,我们可以发现平均值那一项和我们怎么分的具体方案无关,影响答案的是每个矩阵的矩阵和的平方,由于数据很小,我们可以预处理出每个矩阵的和的平方,执行状态转移。

    设dp[l1][r1][l2][r2][k]是矩阵l1,r1,l2,r2切割k次的最小值,我们可以枚举是横着切还是竖着切执行状态转移。

    代码:

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #define INF 0x3f3f3f3f
    using namespace std;
    
    int dp[10][10][10][10][16], sum[10][10][10][10];
    bool v[10][10][10][10][16];
    int a[10][10];
    
    void init() {
    	for (int l1 = 1; l1 <= 8; l1++) 
    		for (int r1 = 1; r1 <= 8; r1++)
    			for (int l2 = l1; l2 <= 8; l2++)
    				for (int r2 = r1; r2 <= 8; r2++) {
    					int ans = 0;
    					for (int i = l1; i <= l2; i++)
    						for (int j = r1; j <= r2; j++) {
    							ans += a[i][j]; 
    						}
    					sum[l1][r1][l2][r2] = ans * ans;
    				}
    }
    
    int solve(int l1, int r1, int l2, int r2, int k) {
    	if (v[l1][r1][l2][r2][k]) return dp[l1][r1][l2][r2][k];
    	if (k == 1) {
    		return dp[l1][r1][l2][r2][k] = sum[l1][r1][l2][r2];
    	}
    	int ans = INF;
    	for (int i = l1; i < l2; i++) {
    		ans = min(ans, min(solve(l1, r1, i, r2, k - 1) + sum[i + 1][r1][l2][r2], solve(i + 1, r1, l2, r2, k - 1) + sum[l1][r1][i][r2]));
    	}
    	for (int i = r1; i < r2; i++) {
    		ans = min(ans, min(solve(l1, r1, l2, i, k - 1) + sum[l1][i + 1][l2][r2], solve(l1, i + 1, l2, r2, k - 1) + sum[l1][r1][l2][i]));
    	}
    	v[l1][r1][l2][r2][k] = 1;
    	return dp[l1][r1][l2][r2][k] = ans;
    }
    int main() {
    	int n, tot = 0;
    	scanf("%d", &n);
    	for (int i = 1; i <= 8; i ++) {
    		for (int j = 1; j <= 8 ; j++) {
    			scanf("%d", &a[i][j]);
    			tot += a[i][j];
    		}
    	}
    	init();
    	solve(1, 1, 8, 8, n);
    	double ans = sqrt(dp[1][1][8][8][n] * 1.0 / n - (tot * 1.0 / n) * (tot * 1.0 / n));
    	printf("%.3f
    ", ans);
    } 
    

      

  • 相关阅读:
    遍历 HashMap 的 5 种最佳方式
    Spring注入方式
    搜索引擎
    MySQL 中常见的时间类型有三种 DATE, DATETIME 和 TIMESTAMP
    向Arcglobe中添加MouseWheel事件,使其具有鼠标放大缩小功能。
    js eval
    鼠标指针图标:C#设置鼠标指针图标(转)
    对象模型图【OMD】阅读指南(转)
    ArcGIS 9.3 VBA 环境不可用问题的解决
    用实例学ASP.net2.0的CallBack机制[一] 20080308 11:33
  • 原文地址:https://www.cnblogs.com/pkgunboat/p/10339802.html
Copyright © 2011-2022 走看看