洛谷蓝桥杯刷题
洛谷P8599蓝桥杯2013省B带分数,枚举题
新知识:位于algorithm中的next_permutation(a,a + n)生成下一个数字的全排列数组。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, ans;
int t;
int main() {
cin >> n;
while(1){
int x = 0;
for(int i = 1; i <= 7; i++){
x = x * 10 + a[i];
int y = 0;
for(int j = i + 1; j <= 8; j++){
y = y * 10 + a[j];
int z = 0;
for(int k = j + 1; k <= 9; k++){
z = z * 10 + a[k];
}
if(y % z == 0 && x + y / z == n)ans++;
}
}
next_permutation(a + 1, a + 9 + 1);
//检查是否会到开头
bool ok = 0;
for(int i = 1; i <= 9; i++){
if(a[i] != i){
ok = 1;
break;
}
}
if(!ok)break;
}
return 0;
}
洛谷P8612地宫取宝
dfs暴力
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
const int N = 55, p = 1e9 + 7;
int mp[55][55];
int ans;
void dfs(int x, int y, int maxv, int num){
if(x == n + 1 || y == m + 1)return;
if(x == n && y == m){
if(num == k || num == k - 1 && mp[x][y] > maxv){
ans++;
}
ans %= p;
return;
}
dfs(x, y + 1, maxv, num);
dfs(x + 1, y, maxv, num);
if(mp[x][y] > maxv){
dfs(x, y + 1, mp[x][y], num + 1);
dfs(x + 1, y, mp[x][y], num + 1);
}
}
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> mp[i][j];
}
}
dfs(1, 1, -1, 0);
cout << ans << endl;
return 0;
}
记忆化搜索优化
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
const int N = 55, p = 1e9 + 7;
int mp[N][N];
int dp[N][N][15][15];//记忆化搜索数组
int dfs(int x, int y, int maxv, int num){//num为东西个数,maxv表示当前的值
if(x == n + 1 || y == m + 1)return 0;
if(dp[x][y][maxv + 1][num] != -1)return dp[x][y][maxv + 1][num];
long long ans = 0;
if(x == n && y == m){
if(num == k || num == k - 1 && mp[x][y] > maxv){
ans++;
}
}
else{
ans += dfs(x, y + 1, maxv, num);
if(mp[x][y] > maxv)ans += dfs(x, y + 1, mp[x][y], num + 1);
ans += dfs(x + 1, y, maxv, num);
if(mp[x][y] > maxv)ans += dfs(x + 1, y, mp[x][y], num + 1);
}
dp[x][y][maxv + 1][num] = ans % p;
return dp[x][y][maxv + 1][num];
}
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> mp[i][j];
}
}
memset(dp, -1, sizeof(dp));
cout << dfs(1, 1, -1, 0) << endl;
return 0;
}