Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3ae3ace

Browse files
committed
.
1 parent d34314f commit 3ae3ace

12 files changed

+122
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#include<bits/stdc++.h>
2+
using namespace std;
3+
typedef unsigned short ushort;
4+
const int maxSize = 25,inf=10000;
5+
ushort rect[maxSize][maxSize];
6+
//ushort rect2[maxSize][maxSize][maxSize][maxSize];
7+
auto rect2=new ushort[maxSize][maxSize][maxSize][maxSize];
8+
9+
class Solution {
10+
public:
11+
int tilingRectangle(int n, int m) {
12+
if (n > m)swap(n, m);
13+
if (rect[n][m])return rect[n][m];
14+
15+
//方形情况
16+
if (n == m)return rect[n][m] = 1;
17+
18+
int ans=inf;
19+
//分解为方形+矩形(方形顶满情况)
20+
//int ans = 1 + tilingRectangle(n, m - n);
21+
22+
//分解为方形+L形,枚举方形的边长,其中加的1就是方形占用数量
23+
/*for (int i = n-1; i > 0; i--)
24+
{
25+
//L形的分解可以在横轴也可以在竖轴枚举,下面的Rect2只枚举横轴,竖轴通过旋转改为枚举横轴
26+
//L形枚举
27+
ans = min(ans, solveL(n - i, m, n, m - i) + 1);
28+
}*/
29+
30+
// decompose into R+R
31+
for (int i=1;i<n;++i)ans=min(ans,tilingRectangle(i,m)+tilingRectangle(n-i,m));
32+
for (int i=1;i<m;++i)ans=min(ans,tilingRectangle(n,i)+tilingRectangle(n,m-i));
33+
34+
// decompose into R+L
35+
for (int i=1;i<n;++i)
36+
for (int j=1;j<m;++j)
37+
ans=min(ans,tilingRectangle(i,j)+solveL(n-i,m,n,m-j));
38+
39+
// decompose into L+L
40+
for (int I=0;I<2;++I){
41+
for (int i=1;i<n;++i)
42+
for (int j=i+1;j<n;++j)
43+
for (int k=1;k<m;++k)
44+
ans=min(ans,solveL(i,m,j,k)+solveL(n-j,m,n-i,m-k));
45+
swap(n,m);
46+
}
47+
return rect[n][m] = ans;
48+
}
49+
50+
int solveL(int n1, int m1, int n2, int m2){
51+
if (rect2[n1][m1][n2][m2])return rect2[n1][m1][n2][m2];
52+
return rect2[n1][m1][n2][m2] = min(Rect2(n1,m1,n2,m2),Rect2(m2,n2,m1,n1));
53+
}
54+
55+
//L-shape
56+
int Rect2(int n1, int m1, int n2, int m2) //short1,long2,long1,short2
57+
{
58+
//恰好分为两个矩形(只需考虑一种,另一种已经在旋转中处理了)
59+
int ans = tilingRectangle(n1, m1 - m2) + tilingRectangle(n2, m2);
60+
61+
//cut from a longer edge
62+
for (int i=1;i<n1;++i)
63+
ans=min(ans,tilingRectangle(i,m1)+solveL(n1-i,m1,n2-i,m2));
64+
65+
//cut at another corner
66+
for (int i=1;i<n1;++i)
67+
ans=min(ans,tilingRectangle(i,m1-m2)+solveL(n1-i,m1,n2,m2));
68+
69+
//枚举切分矩形的长度,注意旋转保证边长无负数
70+
for (int i = 1; i < m1; i++)
71+
if (m1 - i > m2)
72+
//注意L形的两种枚举
73+
ans = min(ans, tilingRectangle(n1, i) + solveL(n1, m1 - i, n2, m2));
74+
else if (m2 > m1 - i)
75+
ans = min(ans, tilingRectangle(n1, i) + solveL(n2 - n1, m2, n2, m1 - i));
76+
return ans;
77+
}
78+
}A;
79+
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
1. binary search. O(n^2 log U).
2+
2. dijkstra twice. proof: https://leetcode.cn/problems/modify-graph-edge-weights/solution/xiu-gai-tu-zhong-de-bian-quan-by-leetcod-66bg/
3+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
O(1).
2+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
closest pair. O(n).
2+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
counting hamiltonian path. O(n^2*2^n).
2+

‎2701-2800/2742. Painting the Walls.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
knapsack. O(nU).
2+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Divide into cases. O(1).
2+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const int N=1005,CH=256,inf=1<<20;
2+
int f[CH],f1[CH];
3+
inline void upd(int &x,int y){if (y>x)x=y;}
4+
class Solution {
5+
public:
6+
int minimizeConcatenatedLength(vector<string>& a) {
7+
int n=a.size(),add=0,add1=0,ma=0,ma1=0;
8+
for (int i='a';i<='z';++i)f[i]=f1[i]=-inf;
9+
f[a[0][0]]=0; f1[a[0].back()]=0;
10+
for (int i=1;i<n;++i){
11+
char x=a[i-1][0],y=a[i-1].back(),x1=a[i][0],y1=a[i].back();
12+
int v=max(f[y1]+1+add,ma),v1=max(f1[x1]+1+add1,ma1);
13+
if (y==x1)++add,++ma;
14+
if (y1==x)++add1,++ma1;
15+
upd(ma1,v); upd(ma,v1);
16+
upd(f1[y],v-add1); upd(f[x],v1-add);
17+
}
18+
int ans=-max(ma,ma1);
19+
for (int i=0;i<n;++i)ans+=a[i].size();
20+
return ans;
21+
}
22+
};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
sorting, sliding window. O(sort(n)).
2+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
enumerate the number of steps, which is O(log n). O(log n).
2+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /