日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[BZOJ 1048] [HAOI2007] 分割矩阵 【记忆化搜索】

發(fā)布時間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ 1048] [HAOI2007] 分割矩阵 【记忆化搜索】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:BZOJ - 1048

?

題目分析

感覺這種分割矩陣之類的題目很多都是這樣子的。

方差中用到的平均數(shù)是可以直接算出來的,然后記憶化搜索 Solve(x, xx, y, yy, k) 表示橫坐標范圍 [x, xx], 縱坐標范圍 [y, yy] 的矩陣切成 k 塊的最小 sigma((Vi - Ave)^2) 。

然后再遞歸將矩陣分得更小,直到 k 為 1 的時候直接返回相應的值。

?

代碼

#include <iostream> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <cstdio>using namespace std;const int MaxN = 15 + 5, MaxT = 15 + 5;int n, m, t, Num; int Sum[MaxN][MaxN];typedef double DB;const DB INF = 999999999;DB Ave; DB f[MaxN][MaxN][MaxN][MaxN][MaxT];DB Get(int x, int y, int xx, int yy) {return (DB)(Sum[xx][yy] - Sum[x - 1][yy] - Sum[xx][y - 1] + Sum[x - 1][y - 1]); }inline DB Sqr(DB x) {return x * x;} inline DB gmin(DB a, DB b) {return a < b ? a : b;}DB Solve(int x, int xx, int y, int yy, int k) {if (f[x][xx][y][yy][k] != -1) return f[x][xx][y][yy][k];if (k == 1) return f[x][xx][y][yy][k] = Sqr(Get(x, y, xx, yy) - Ave);DB ret = INF;for (int i = x; i <= xx - 1; ++i)for (int j = 1; j <= k - 1; ++j)ret = gmin(ret, Solve(x, i, y, yy, j) + Solve(i + 1, xx, y, yy, k - j));for (int i = y; i <= yy - 1; ++i) for (int j = 1; j <= k - 1; ++j) ret = gmin(ret, Solve(x, xx, y, i, j) + Solve(x, xx, i + 1, yy, k - j));return f[x][xx][y][yy][k] = ret; }int main() {scanf("%d%d%d", &n, &m, &t);for (int i = 1; i <= n; ++i)for (int j = i; j <= n; ++j)for (int p = 1; p <= m; ++p)for (int q = p; q <= m; ++q)for (int o = 1; o <= t; ++o) f[i][j][p][q][o] = -1;memset(Sum, 0, sizeof(Sum));for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {scanf("%d", &Num);Sum[i][j] = Sum[i][j - 1] + Sum[i - 1][j] - Sum[i - 1][j - 1] + Num;}}Ave = (DB)Sum[n][m] / (DB)t;Solve(1, n, 1, m, t);printf("%.2lf\n", sqrt(f[1][n][1][m][t] / t));return 0; }

  

轉(zhuǎn)載于:https://www.cnblogs.com/JoeFan/p/4263820.html

總結(jié)

以上是生活随笔為你收集整理的[BZOJ 1048] [HAOI2007] 分割矩阵 【记忆化搜索】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。