zoukankan      html  css  js  c++  java
  • 洛谷P1436 棋盘分割

    二维区间DP/记忆化搜索

    原题是求均方差 需要用数学知识化简 转化为求最小平方和

    状态:f[k][x1][y1][x2][y2] 表示把左上端点为(x1,y1)、右下端点为(x2,y2)的棋盘分割成k个部分所得的最小平方和

    边界:当k=1时 为(x1,y1)到(x2,y2)的和的平方

    目标:f[n][1][1][8][8]

    状态转移方程复杂,DP需要四五层循环,这里采用记忆化搜索

    转移过程:

    for(int i=x1;i<=x2;++i){//枚举行 把该矩形横向切开
    		ans=min(ans,solve(k-1,x1,y1,i,y2)+solve(1,i+1,y1,x2,y2));//上半部分切成k-1块 下半部分不动
    		ans=min(ans,solve(1,x1,y1,i,y2)+solve(k-1,i+1,y1,x2,y2));//上半部分不动 下半部分切成k-1块
    	}
    	for(int i=y1;i<=y2;++i){//枚举列 把该矩形纵向切开
    		ans=min(ans,solve(k-1,x1,y1,x2,i)+solve(1,x1,i+1,x2,y2));//左半部分切成k-1块 右半部分不动
    		ans=min(ans,solve(1,x1,y1,x2,i)+solve(k-1,x1,i+1,x2,y2));//左半部分不动 右半部分切成k-1块
    	}
    

    code:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define square(x) (x*x)
    #define s(x1,y1,x2,y2) (sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1])
    const int inf=0x3f3f3f3f;
    int ans,n,g[20][10][10][10][10],sum[20][20],a[20][20];
    int solve(int k,int x1,int y1,int x2,int y2){
    	if(k==1) return g[k][x1][y1][x2][y2]=square(s(x1,y1,x2,y2));
    	if(g[k][x1][y1][x2][y2]!=-inf) return g[k][x1][y1][x2][y2];
    	int ans=inf;
    	for(int i=x1;i<=x2;++i){
    		ans=min(ans,solve(k-1,x1,y1,i,y2)+solve(1,i+1,y1,x2,y2));
    		ans=min(ans,solve(1,x1,y1,i,y2)+solve(k-1,i+1,y1,x2,y2));
    	}
    	for(int i=y1;i<=y2;++i){
    		ans=min(ans,solve(k-1,x1,y1,x2,i)+solve(1,x1,i+1,x2,y2));
    		ans=min(ans,solve(1,x1,y1,x2,i)+solve(k-1,x1,i+1,x2,y2));
    	}
    	return g[k][x1][y1][x2][y2]=ans;
    }
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=8;++i) for(int j=1;j<=8;++j){
    		scanf("%d",&a[i][j]);
    		sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
    	}
    	for(int k=1;k<=15;++k) for(int x1=1;x1<=8;++x1) for(int x2=1;x2<=8;++x2)
    	for(int x3=1;x3<=8;++x3) for(int x4=1;x4<=8;++x4) g[k][x1][x2][x3][x4]=-inf;
    	ans=solve(n,1,1,8,8);
    	printf("%d",ans);
    	return 0;
    }
  • 相关阅读:
    114. Flatten Binary Tree to Linked List 把二叉树变成链表
    426. Convert Binary Search Tree to Sorted Doubly Linked List把bst变成双向链表
    微服务之如何建模微服务
    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3t37r4hauhq8c
    剑指offer之面试题2:实现Singleton模式
    微服务之演化式架构师(二)
    ASP.NET Core 框架本质学习
    java之maven之maven的使用
    java之maven之初识maven
    java之mybatis整合spring
  • 原文地址:https://www.cnblogs.com/yu-xing/p/10389888.html
Copyright © 2011-2022 走看看