Uva--10913(动规,记忆化搜索,多维度)

本文介绍了一种使用记忆化搜索解决特定迷宫问题的方法,该问题要求找到从起点到终点的最大路径和,同时限制了经过负权格子的数量。文章详细解释了为何普通的递推动态规划方法不适用,并给出了具体的C++实现代码。

2014-08-25 00:43:21

思路:本来想用递推式写的,写了半天还是WA,原因在于方向,这题和以前hdu写的走迷宫(只能右 / 下方向)凑最大点数那题不同,这题左右都可以走,而且又规定一个格子不能走两遍,所以普通递推DP是难以知道这个状态是从哪个方向转移来的,如果从右边转移来的,那么接下来右边就不能走了(左边同理)。

以为了方便,这题直接用记忆化搜索解,dp[i][j][k][dir] 表示用[i,j]这个点到终点经过k次负权格子,且状态是从dir方向转移来的最大路径和。

(后来想想,如果在普通递推DP中加上方向维度,可能也可行,呵呵)

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cmath>
 5 using namespace std;
 6 const int INF = 1 << 30;
 7 typedef long long ll;
 8 
 9 int n,k;
10 int g[80][80];
11 ll dp[80][80][6][5];
12 int caled[80][80][6][5];
13 int vis[80][80];
14 int Case = 0;
15 
16 ll Dfs(int x,int y,int cnt,int dir){
17     ll &res = dp[x][y][cnt][dir];
18     if(g[x][y] < 0){
19         cnt++;
20         if(cnt > k){
21             return -INF;
22         }
23     }
24     if(x == 1 && y == 1){
25         return res = g[x][y];
26     }
27     if(caled[x][y][cnt][dir]){
28         return res;
29     }
30     caled[x][y][cnt][dir] = 1;
31     res = -INF;
32     vis[x][y] = 1;
33     ll tem;
34     if(y > 1 && !vis[x][y - 1]){
35         if((tem = Dfs(x,y - 1,cnt,4)) != -INF){
36             res = max(res,tem + g[x][y]);
37         }
38     }
39     if(y < n && !vis[x][y + 1]){
40         if((tem = Dfs(x,y + 1,cnt,2)) != -INF){
41             res = max(res,tem + g[x][y]);
42         }
43     }
44     if(x > 1 && !vis[x - 1][y]){
45         if((tem = Dfs(x - 1,y,cnt,1)) != -INF){
46             res = max(res,tem + g[x][y]);
47         }
48     }
49     vis[x][y] = 0;
50     //printf("dp[%d][%d][%d] : %d\n",x,y,cnt,res);
51     return res;
52 }
53 
54 int main(){
55     //freopen("in.txt","r",stdin);
56     while(scanf("%d%d",&n,&k) == 2 && (n || k)){
57         for(int i = 1; i <= n; ++i){
58             for(int j = 1; j <= n; ++j){
59                 scanf("%d",&g[i][j]);
60             }
61         }
62         memset(vis,0,sizeof(vis));
63         memset(caled,0,sizeof(caled));
64         ll ans = Dfs(n,n,0,1);
65         printf("Case %d: ",++Case);
66         if(ans == -INF){
67             printf("impossible\n");
68         }
69         else{
70             printf("%lld\n",ans);
71         }
72     }
73     return 0;
74 }

 

转载于:https://www.cnblogs.com/naturepengchen/articles/3933967.html

先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值