题目链接:Coin on the Table

一开始想用DFS做的,做了好久都超时。

看了题解才明白要用动态规划。

设置一个三维数组dp,其中dp[i][j][k]表示在时间k到达(i,j)所需要做的最小改动,那么递推式如下:

图片来源:Editorial,其中当从周围的格子可以直接移动到(i,j)时,delta=0;否则,需要改变周围格子的方向符号,delta=1。

即k-1时刻在(i,.j)周围的四个格子,然后在k时刻移动到(i,j)。并且,看这四个格子中的方向符号是否直接可以完成这次移动,否则就改变这四个格子的方向符号。

代码如下:

 import java.util.*;

 public class Solution {    

     public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int K = in.nextInt(); char[][] map= new char[n][m];
int[][][] dp = new int[n][m][K+1]; int star_x = 0;
int star_y = 0; for(int i = 0;i < n;i++){
String s = in.next();
if(s.contains("*"))
{
star_x = i;
star_y = s.indexOf("*");
}
map[i]=s.toCharArray();
} for(int k=0;k <= K;k++){
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
if(k==0)
dp[i][j][k] = (i==0&&j==0? 0:Integer.MAX_VALUE-1);
else{
dp[i][j][k] = CalcuMin(i,j,k,dp,map);
}
}
}
} int answer = Integer.MAX_VALUE-1;
for(int k = 0;k <= K;k++){
answer = Math.min(answer, dp[star_x][star_y][k]);
} System.out.println(answer==Integer.MAX_VALUE-1?-1:answer); } private static int CalcuMin(int i, int j, int k,int[][][] dp, char[][] map) {
// TODO Auto-generated method stub
int mini = Integer.MAX_VALUE-1;
int n = map.length;
int m = map[0].length; if(i-1>=0){
if(dp[i-1][j][k-1]+(map[i-1][j]=='D'?0:1) < mini )
mini = Math.min(mini,dp[i-1][j][k-1]+(map[i-1][j]=='D'?0:1));
} if(i+1<n){
if(dp[i+1][j][k-1]+(map[i+1][j]=='U'?0:1) < mini )
mini = Math.min(mini,dp[i+1][j][k-1]+(map[i+1][j]=='U'?0:1));
} if(j-1>=0){
if(dp[i][j-1][k-1]+(map[i][j-1]=='R'?0:1) < mini )
mini = Math.min(mini,dp[i][j-1][k-1]+(map[i][j-1]=='R'?0:1));
} if(j+1<m){
if(dp[i][j+1][k-1]+(map[i][j+1]=='L'?0:1) < mini )
mini = Math.min(mini,dp[i][j+1][k-1]+(map[i][j+1]=='L'?0:1));
}
return mini;
}
}

最新文章

  1. C++中的初始化
  2. 为什么很多人用keepalived来实现redis故障转移
  3. 解决:mvn archetype:create Abstract class or interface &#39;org.apache.maven.artifact.repository.ArtifactRepository&#39; cannot be instantiated
  4. 小谈一下Java I/O
  5. 一个sql导致temp表空间爆掉
  6. javascript在一个字符串中每隔多少字符插入某个字符串
  7. 前端架构之路:使用Vue.js开始第一个项目
  8. 移动端IOS第三方输入法遮挡底部Input及android键盘回落留白问题
  9. CentOS 7 GUI图形界面安装
  10. 我对CSS的认识
  11. python脚本难点
  12. Java内存模型-final域的内存语义--没明白,预留以后继续理解
  13. Flutter的脚手架(Scaffold)
  14. 如何创建R包并将其发布在 CRAN / GitHub 上--转载
  15. Python 学习书籍推荐
  16. Python_oldboy_自动化运维之路_面向对象2(十)
  17. 【巷子】---webpack配置非CMD规范的模块
  18. 1.keras实现--&gt;自己训练卷积模型实现猫狗二分类(CNN)
  19. Scrapy框架——CrawlSpider爬取某招聘信息网站
  20. ZT 俞敏洪:2014我要闭嘴 相信未来不是梦

热门文章

  1. Linux Linux程序练习一
  2. iframe定位获取
  3. YII安装步骤(windows)
  4. 苯(Benzene)
  5. Problem 500!!! (Project Euler 500)
  6. BestCoder Round #93 ABC
  7. JDK之ThreadLocal分析
  8. FastExcel遇到的问题
  9. 如何运行Python程序
  10. Spring JDBC-混合框架的事务管理