目录
今天做了2道题目,花了3个小时。
1.记忆化搜索练习题:滑雪
算法:记忆化搜索,从四个方向搜索。
评测结果:AC
源代码:
#include <bits/stdc++.h>
using namespace std;
int a[110][110];
int xx[5] = {0,-1,1,0,0};
int yy[5] = {0,0,0,-1,1};
int f[110][110];
int r,c;
int search(int x,int y){
if(f[x][y] != 0)return f[x][y];
int tmp = 1;
for(int i = 1;i <= 4;i++){
int tx = x + xx[i],ty = y + yy[i];
if(tx >= 1 && tx <= r && ty >= 1 && ty <= c && a[tx][ty] < a[x][y]){
tmp = max(tmp,search(tx,ty) + 1);
}
}
f[x][y] = tmp;
}
int main(){
cin>>r>>c;
for(int i = 1;i <= r;i++){
for(int j = 1;j <= c;j++){
cin>>a[i][j];
}
}
int anss = 0,ans = 0;
for(int i = 1;i <= r;i++){
for(int j = 1;j <= c;j++){
int anss = search(i,j);
ans = max(ans,anss);
}
}
cout<<ans;
return 0;
}
2.记忆化搜索练习题:迷宫
题面:
走迷宫(maze.pas)
[题目描述]
有一个n*n的迷宫,每个方格里都有着相应的数字。你从左上角出发,每次可以向上下左右四个方向最多移动k格,并且要求你每次到达的方格里的数字必须大于上一次所在方格的数字。现在要求你走过的方格的所有数之和最大,问这个最大和是多少。
[输入]
输入数据第一行为两个正整数N、K(1<=N<=100,0<=K<=N)
接下来的n行,每行有n个不超过integer范围的整数,表示地图中的数。
[输出]
输出数据只有一行,为最大的和。
算法:记忆化搜索,只比滑雪(前一题)多一重循环即可。
评测结果:AC
源代码:
#include<bits/stdc++.h>
using namespace std;
int a[110][110],f[110][110];
#define inf 0x3f3f3f
long long n,k;
long long xx[8] = {0,-1,1,0,0};
long long yy[8] = {0,0,0,-1,1};
int search(int x,int y) {
if(f[x][y])return f[x][y];
int tmp = 0;
for(long long i = 1; i <= 4; i++) {
for(long long j = 1; j <= k; j++) {
int tx = x + xx[i] * j,ty = y + yy[i] * j;
if(tx >= 1 && tx <= n && ty >= 1 && ty <= n && a[x][y] < a[tx][ty]) {
tmp = max(tmp,search(tx,ty));
}
}
}
f[x][y] = tmp + a[x][y];
return f[x][y];
}
int main() {
cin>>n>>k;
for(long long i = 1; i <= n; i++) {
for(long long j = 1; j <= n; j++) {
cin>>a[i][j];
}
}
cout<<search(1,1);
return 0;
}