蓝桥杯03

买不到的数目

题目

简单dp题,有一点细节要注意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 110;
int dp[N];
int main(){
int n, m;
cin >> n >> m;
dp[0] = 1;
if(n > m) swap(n, m);
int ans = 0;
for(int i = n; i < n * m; i++){
if(dp[i - n] || (i >= m && dp[i - m])){
dp[i] = true;
}
else ans = i;
}
cout << ans << endl;
return 0;
}

饮料换购

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;

int main(){
int n;
cin >> n;
int ans = n;
while(n >= 3){
n -= 3;
n += 1;
ans++;
}
cout << ans << endl;
return 0;
}

摘花生

题目

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
using namespace std;
const int N = 110;

int a[N][N];

int main(){
int T;
cin >> T;
while(T--){
int r, c;
cin >> r >> c;
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
cin >> a[i][j];
}
}
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
a[i][j] += max(a[i - 1][j], a[i][j - 1]);
}
}
cout << a[r][c] << endl;
}
return 0;
}

最长上升子序列

题目

一段时间不写动态规划, 跟个傻子一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 10000;
int a[N];
vector<int> dp(N, 1);//首先将数组初始化为1, 表示最小长度为1
int main(){
int n;
cin >> n;
int ans = 0;

for(int i = 0; i < n; i++) {
cin >> a[i];
}
for(int i = 1; i < n; i++){
for(int j = 0; j <= i - 1; j++){
//固定右端点, 比较左边每一个数, 遍历出dp[i]的max值
// i大于j的值就更新一下
if(a[i] > a[j]) dp[i] = max(dp[i], dp[j] + 1);
}
//因为最后一个dp不一定是答案, 所以要用一个变量记录一下
ans = max(dp[i], ans);
}
cout << ans << endl;

return 0;
}