noip模拟赛 蒜头君的坐骑
2024-09-20 23:18:24
分析:标准的棋盘dp问题.
如果没有技能,那么就很好做了,相当于传纸条的做法.有了技能的限制,我们就要加上一维表示用了多少次技能,这个时候转移就要用到dfs了,而且不能用填表法,要用刷表法,从当前位置用技能的状态来更新到达的位置的状态,dp状态转移方程也要写成刷表法的形式.
如果很难从以前的状态推得现在的状态,那么就用现在的状态去更新以后的状态吧!
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
const int inf = 0x7ffffff; int n, m, t, k, h, atk,f[][][],a[][],ans = inf; int jisuan(int xue, int gongji)
{
return(h - ) / gongji * xue;
} void dfs(int x,int y,int cur,int xue,int gongji,int depth)
{
if (depth > k)
{
f[x][y][cur + ] = min(f[x][y][cur + ], xue);
return;
}
if (x + <= n)
dfs(x + , y, cur, xue + jisuan(a[x + ][y],gongji + a[x + ][y]), gongji + a[x + ][y], depth + );
if (y + <= m)
dfs(x, y + , cur, xue + jisuan(a[x][y + ], gongji + a[x][y + ]), gongji + a[x][y + ], depth + );
} int main()
{
scanf("%d%d%d%d%d%d", &n, &m, &t, &k, &h, &atk);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
scanf("%d", &a[i][j]);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
for (int l = ; l <= t; l++)
f[i][j][l] = inf;
f[][][] = ;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
for (int l = ; l <= t; l++)
{
if (l != t)
dfs(i, j, l, f[i][j][l], atk,);
if (i + <= n)
f[i + ][j][l] = min(f[i + ][j][l], f[i][j][l] + jisuan(a[i + ][j], atk));
if (j + <= m)
f[i][j + ][l] = min(f[i][j + ][l], f[i][j][l] + jisuan(a[i][j + ], atk));
}
for (int i = ; i <= t; i++)
ans = min(ans, f[n][m][i]);
printf("%d\n", ans); return ;
}
最新文章
- Visual Studio原生开发的10个调试技巧
- RESTful在asp.net webAPI下的PUT、POST实现,json传输实体
- iOS开发——高级技术&;内购服务
- Hadoop2.x源码-编译剖析
- sql多表查询(out join,inner join, left join, right join)
- iOS 8.3 JB ready
- Linux企业级项目实践之网络爬虫(19)——epoll接口
- uva 11137 Ingenuous Cubrency(完全背包)
- 17.1 Replication Configuration 复制:
- SaltStack Job管理
- Linux的capability深入分析
- poj 3461 Oulipo(KMP模板题)
- PHP7的异常处理机制,set_error_handler和set_exception_handler方法介绍
- Vuex 2.0 深入简出
- impala教学视频
- Android权限之动态权限
- MapReduce编程:词频统计
- Vue.js——常用的指令
- win10系统安装web3js的正确方法
- 八、mini2440裸机程序之UART(1)简单介绍【转】