UVA 116记忆化搜索

本文介绍了一个寻找矩阵中从左至右最短路径的算法实现,该算法考虑了矩阵的边界行相邻特性,并通过深度优先搜索(DFS)递归地找到最小路径总和及其对应的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从矩阵左边到矩阵右边,最上最下两行算作相邻,可以


 走。所以记录路径的时候列不用记(+1),输出字典序路径,所以始终从行数最小的行开始找,(从n列开始倒序向前就不会有顺序问题),正序需要判断行数。

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

const int INF = 0x3f3f3f3f;
int a[15][105];
int dp[15][105];
int dis1[][2] = {{1,1},{-1,1},{0,1}};
int dis[][2] = {{-1,1},{0,1},{1,1}};
int dis2[][2] = {{0,1},{1,1},{-1,1}};
int vis[15][105];
int m,n;

int dfs(int x,int y){
    int ans = dp[x][y];
    int Min = INF;
    int mx,my;
    if(y == n){
        //cout<<x<<y<<endl;
        dp[x][y] = a[x][y];
        return dp[x][y];
    }

    for(int i = 0; i < 3; i++){
        int nx,ny;
        if(x == 1){
            nx = x + dis2[i][0];
            ny = y + dis2[i][1];
        }else if(x == m){
            nx = x + dis1[i][0];
            ny = y + dis1[i][1];
        }else{
            nx = x + dis[i][0];
            ny = y + dis[i][1];
        }
        //cout<<nx<<" "<<ny<<endl;
        if(nx >= 0 && nx <= m+1 && ny >= 1 && ny <= n){
            if(nx == 0)
                nx = m;
            if(nx == m+1)
                nx = 1;
            if(dp[nx][ny] == INF)
                ans = a[x][y] + dfs(nx,ny);
            else
                ans = a[x][y] + dp[nx][ny];
        }
        if(ans < Min){
            Min = ans;
            mx = nx;
            my = ny;
        }
    }
    dp[x][y] = Min;
    vis[x][y] = mx;
    return dp[x][y];
}
int main(){
    while(~scanf("%d%d",&m,&n)){
        memset(dp, INF, sizeof dp);
        memset(vis, 0, sizeof vis);
        for(int i = 1; i <= m; i++)
            for(int j = 1; j <= n; j++)
                scanf("%d",&a[i][j]);
        int Min = INF;
        int s;
        for(int i = 1; i <= m; i++){
            int t = dfs(i,1);
            if(t < Min){
                s = i;
                Min = t;
            }
        }

        int mx = s,my = 1;
        printf("%d",s);
        while(my != n){
            printf(" %d",vis[mx][my]);
            mx = vis[mx][my];
            my++;
        }
        printf("\n%d\n",Min);
    }
    return 0;
}







内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
### 关于记忆化搜索的练习题 在洛谷平台上有许多涉及记忆化搜索的经典题目,这些题目可以帮助学习者更好地理解动态规划与深度优先搜索相结合的方法。以下是几个推荐的记忆化搜索练习题及其背景介绍: #### 题目一:P4170 [CQOI2007] 涂色 此题属于经典的 DP 类型问题之一,主要考察如何通过记忆化的方式优化暴力枚举的过程[^1]。 该题的核心在于利用状态压缩技术存储已经处理过的子结构,并结合 DFS 的方式逐步扩展解空间。 #### 题目二:P1464 Function 这是一个典型的递归加记忆化的入门级题目[^2]。它强调了在搜索过程中记录中间结果的重要性,从而避免不必要的重复计算。具体实现上可以通过定义一个辅助数组 `f[x][y]` 来保存已访问的状态值。 #### 题目三:UVA - 1629 Cake Slicing 这篇文章提到的一道经典例题展示了记搜的优势所在[^3]。通过对不同切割方案的结果进行缓存操作,可以显著降低时间复杂度并提高效率。 #### 题目四:滑雪 (P1434) 作为一道非常受欢迎的记忆化搜索练习题,“滑雪”模拟了一个二维网格上的最长下降路径求解过程[^5]。给定一张地图表示各个位置的高度分布情况后,我们需要找到从任意起点出发能够达到的最大步数长度。 ```python from functools import lru_cache @lru_cache(None) def dfs(x, y): res = 1 directions = [(0,-1),(-1,0),(0,+1),(+1,0)] for dx, dy in directions: nx, ny = x + dx, y + dy if 0<=nx<R and 0<=ny<C and grid[nx][ny]<grid[x][y]: res = max(res, dfs(nx, ny)+1 ) return res R,C=map(int,input().split()) grid=[list(map(int,input().strip().split()))for _ in range(R)] ans=0 for i in range(R): for j in range(C): ans=max(ans ,dfs(i,j)) print(ans) ``` 上述代码片段实现了基于 Python 的解决方案,其中运用装饰器 @lru_cache 实现自动化的函数调用结果缓存功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值