https://leetcode-cn.com/contest/weekly-contest-219/
难度顺序:
。
「提示:」
1 <= n <= 200
「思路:」
按题意模拟即可。
时间复杂度:
.
class Solution {
public:
int numberOfMatches(int n) {
int ans = 0;
while(n != 1) {
if(n & 1) {
ans += (n - 1) / 2;
n = n / 2 + 1;
} else {
ans += n / 2;
n /= 2;
}
}
return ans;
}
};
「提示:」
1 <= n.length <= 10^5
n 仅由数字组成
n 不含任何前导零并总是表示正整数
「思路:」很明显只要找到数位最大值就可以配出和为
。
时间复杂度:
.
class Solution {
public:
int minPartitions(string n) {
int num = 0;
for(int i = 0;i < n.size();i++) {
num = max(num,n[i] - '0');
}
return num;
}
};
「提示:」
n == stones.length
2 <= n <= 1000
1 <= stones[i] <= 1000
「思路」
,爱丽丝要选择使得差值更大的子状态,鲍勃要选择使得差值更小的子状态。
之间石头,且当前先手的人为(爱丽丝/鲍勃),得到最优决策下两人的权值。
,设
数组为前缀和,
,则 有
或者
时间复杂度:
.
class Solution {
public:
int sum[1005];
pair<int,int>dp[1005][1005];
int vis[1005][1005];
pair<int,int> dfs(int l,int r,int flag) {
if(l >= r) return {0,0};
if(vis[l][r]) {
return dp[l][r];
}
pair<int,int>t1 = dfs(l,r - 1,flag ^ 1);
pair<int,int>t2 = dfs(l + 1,r,flag ^ 1);
t1 = {t1.second + sum[r - 1] - sum[l - 1],t1.first};
t2 = {t2.second + sum[r] - sum[l],t2.first};
if(flag) { //增加差值
if(t1.first - t1.second > t2.first - t2.second) {
dp[l][r] = t1;
vis[l][r] = 1;
return t1;
} else {
dp[l][r] = t2;
vis[l][r] = 1;
return t2;
}
} else {
if(t1.second - t1.first > t2.second - t2.first) {
dp[l][r] = t2;
vis[l][r] = 1;
return t2;
} else {
dp[l][r] = t1;
vis[l][r] = 1;
return t1;
}
}
}
int stoneGameVII(vector<int>& stones) {
for(int i = 0;i < stones.size();i++) {
int x = stones[i];
sum[i + 1] = sum[i] + x;
}
pair<int,int>ans = dfs(1,stones.size(),1);
return ans.first - ans.second;
}
};
「提示:」
n == cuboids.length
1 <= n <= 100
1 <= widthi, lengthi, heighti <= 100
「思路」
为将第
个长方体作为最顶上长方体时能得到的最大高度,则有
,
代表第
个长方体的高度
时间复杂度:
.
const int maxn = 1005;
struct Node {
int x,y,z;
int id;
}a[maxn];
int cmp(Node x,Node y) {
return x.x * x.y * x.z < y.x * y.y * y.z;
}
class Solution {
public:
int dp[1005],cnt = 0;
int dfs(int now) {
if(dp[now] != -1) return dp[now];
int ans = a[now].z;
for(int i = now + 1;i <= cnt;i++) {
if(a[now].id == a[i].id) continue;
if(a[now].x <= a[i].x && a[now].y <= a[i].y && a[now].z <= a[i].z) {
ans = max(ans,dfs(i) + a[now].z);
}
}
return dp[now] = ans;
}
int maxHeight(vector<vector<int>>& cuboids) {
memset(dp,-1,sizeof(dp));
for(int i = 0;i < cuboids.size();i++) {
a[++cnt] = {cuboids[i][0],cuboids[i][1],cuboids[i][2],i};
a[++cnt] = {cuboids[i][0],cuboids[i][2],cuboids[i][1],i};
a[++cnt] = {cuboids[i][1],cuboids[i][0],cuboids[i][2],i};
a[++cnt] = {cuboids[i][1],cuboids[i][2],cuboids[i][0],i};
a[++cnt] = {cuboids[i][2],cuboids[i][0],cuboids[i][1],i};
a[++cnt] = {cuboids[i][2],cuboids[i][1],cuboids[i][0],i};
}
sort(a + 1,a + 1 + cnt,cmp);
int ans = 0;
for(int i = 1;i <= cnt;i++) {
ans = max(ans,dfs(i));
}
return ans;
}
};