時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:6 描述
將乙個8*8的棋盤進行如下分割:將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了(n-1)次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。(每次切割都只能沿著棋盤格仔的邊進行)
原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤按上述規則分割成n塊矩形棋盤,並使各矩形棋盤總分的均方差最小。
均方差i為第i塊矩形棋盤的總分。
請程式設計對給出的棋盤及n,求出o'的最小值。
輸入第1行為乙個整數n(1 < n < 15)。
第2行至第9行每行為8個小於100的非負整數,表示棋盤上相應格仔的分值。每行相鄰兩數之間用乙個空格分隔。
輸出僅乙個數,為o'(四捨五入精確到小數點後三位)。
樣例輸入
3樣例輸出1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0
1 1 1 1 1 1 0 3
1.633**
ioi 2000
上傳者
hzyqazasdf
一開始理解錯題意了,以為切完後所有塊都要操作,後來才發現一分為二時,其中一塊便不能再動了,呢就是由大化小的問題了,動態規劃隨便搞搞,感覺記憶化搜尋會好寫一點。。。。。
每次四種選擇,分別搜尋:
(1)橫著切,選上邊一塊
(2)橫著切,選下邊一塊
(3)豎著切,選左邊一塊
(4)豎著切,選右邊一塊
剩下的就是dp了,定義dp[kk][i][j][k][h]:左上角(i,j)到右下角(k,h)組成的矩形,切到第kk次的最優解。
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
#define inf 1000000000
#define mod 1000000007
#define maxn 5100005
#define lowbit(x) (x&-x)
#define eps 1e-9
int dp[20][10][10][10][10],a[10][10][10][10],b[10][10];
int sm(int x,int y,int xx,int yy)
int dfs(int k,int x,int y,int xx,int yy)
{ if(dp[k][x][y][xx][yy]!=-1)
return dp[k][x][y][xx][yy];
int i,j,t1,t2,t;
dp[k][x][y][xx][yy]=inf;
if(xx>x)
{ for(i=x;iy)
{ for(i=y;i
遞迴,記憶化搜尋,(棋盤分割)
題目鏈結 problem 1191memory 568ktime 16mslanguage c result accepted 解題報告 1 公式可以利用數學方法化簡,就是求各個矩陣上的數 的和 的平方和最小。2 每一次分割都有四種情況 遞迴 3 每一次分割的位置要進行比較,從而找到最佳。inclu...
pku 1191 棋盤分割 DP 記憶化搜尋
題意 中文省略.思路 黑說p116有講解,主要的狀態轉移方程為 橫著切 dp k x1 y1 x2 y2 min dp k 1 x1 y1 mid y2 dp 1 mid y1 x2 y2 dp k 1 mid y1 x2 y2 dp 1 x1 y1 mid y2 x1 1 mid x2 豎著切 d...
NYOJ 10 Skiing 記憶化搜尋
題目的意思是 給你乙個n m的矩陣 讓你從中找出一條最長的遞減序列 能走四個方向 上下左右 這道題需要用到 記憶化搜尋 普通搜尋會超時 記憶化搜尋就是在原本記錄該點是否到過的陣列中儲存一些其他資訊 比如上一次到這個點的序列長度是多少 或者直接在這個陣列中儲存答案 兩種都可以 include incl...