P2258 子矩陣 搜尋,動態規劃

2022-04-30 09:24:08 字數 901 閱讀 5491

搜尋+dp.

剛好把搜尋卡死的資料範圍...

然後應該可以很容易想到枚舉行的情況,然後分列去dp.

行的情況直接全排列即可,複雜度最高 \(o(c_^)\).

然後分列進行 dp, \(f[i][j]\) 代表以 \(i\) 為結尾,選了 \(j\) 個的答案.

之後就是個簡單的線性 dp ,對一些絕對值差進行預處理,複雜度 \(o(n^3)\) .

總複雜度 \(o(c_^*n^3)\) ,可以過.

#includeusing namespace std;

int n,m,r,c;

int w[20][20];

int ans=0x3f3f3f3f;

int a[20];

void solve()

,rc[20][20]=,f[20][20]=;

// 以 j 為結尾,長度為 k;

for(int i=1;i<=m;i++)

for(int j=1;j<=r;j++)

memset(f,127,sizeof(f));

f[1][1]=lc[1]; f[0][0]=0;

for(int j=1;j<=m;j++)

for(int k=1;k<=min(j,c);k++)

for(int i=0;if[j][k]=min(f[j][k],f[i][k-1]+rc[j][i]+lc[j]);

for(int i=c;i<=m;i++)

ans=min(f[i][c],ans);

return;

}void dfs(int x)

for(int i=a[x]+1;i<=n-(r-x)+1;i++)

}int main()

洛谷p2258 子矩陣

子矩陣 題目鏈結 然後這是一道非常暴力的題,首先是直接dfs的暴力操作 因為同時枚舉行和列不好列舉,所以我們可以先枚舉行,當行列舉完了,再列舉列。然後都列舉完了,就可以按照題目要求算一下,然後比較算到的答案與當前值的大小,保留較小的那乙個。code includeusing namespace st...

洛谷P2258 子矩陣

題目 如果暴力的話,時間複雜度是 rcc n,n 2 2 主要考察搜尋枚舉行和列,並沒有用到dp的思想。考慮優化的話,發現枚舉行或列中至少需要一步,因為這個題只能預處理優化,如果都不列舉,就相當於盲人摸象,無法預處理來優化。因此要搜尋枚舉行或列,然後預處理並在列或行上跑dp,這樣就可以少些列舉時間,...

洛谷P2258 子矩陣

給出如下定義 子矩陣 從乙個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣 保持行與列的相對順序 被稱為原矩陣的乙個子矩陣。例如,下面左圖中選取第2 4行和第2 4 5列交叉位置的元素得到乙個2 3的子矩陣如右圖所示。9 3 3 3 9 9 4 8 7 4 1 7 4 6 6 6 8 5 6 9 ...