栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

剑指 Offer 13. 机器人的运动范围

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指 Offer 13. 机器人的运动范围

动态规划(及其优化)优化后接近双百

1动态规划问题先找初始值然后找状态方程

2.编写函数twoSum()判断行列的位数和

3.初始值:dp[0] [1]=true

3用二维数组dp[i] [j]记录该位置机器人是否走过

4状态表达式dp[i+1] [j+1]=dp[i] [j+1]||dp[i+1] [j]判断机器人走没走到前一个位置,如果走到了前一个位置且行列位数小于等于指定k时dp[i+1] [j+1]=true;

class Solution {
public:
	int twoSum(int integer1, int integer2) {
		int sum = 0;
		while (integer1 || integer2) {
			int bit1 = integer1 % 10;
			int bit2 = integer2 % 10;
			integer1 = integer1 / 10;
			integer2 = integer2 / 10;
			sum += bit1 + bit2;
		}
		return sum;
	}
	int movingCount(int m, int n, int k) {
		vector>dp(m+1, vector(n+1, false));
		dp[0][1] = true;
		int res = 0;
		for (int i = 0;i < m;i++) {
			for (int j = 0;j < n;j++) {
				if ((dp[i][j+1]||dp[i+1][j])&&twoSum(i, j) <= k) {
					dp[i + 1][j + 1] = true;
					res++;
				}
			}
		}
		return res;
	}
};

滚动数组优化:因为有上述状态方程可知下一个结果至于dp[i+1] [j]和dp[i] [j+1]有关,所以将其优化为一维数组

class Solution {
public:
	int twoSum(int integer1, int integer2) {
		int sum = 0;
		while (integer1 || integer2) {
			int bit1 = integer1 % 10;
			int bit2 = integer2 % 10;
			integer1 = integer1 / 10;
			integer2 = integer2 / 10;
			sum += bit1 + bit2;
		}
		return sum;
	}
	int movingCount(int m, int n, int k) {
		vectordp(n + 1, false);
		dp[1] = true;
		int res = 0;
		for (int i = 0;i < m;i++) {
			for (int j = 0;j < n;j++) {
				if ((dp[j+1]||dp[j])&&twoSum(i, j) <= k) {
					dp[j + 1] = true;
					res++;
				}
				else {
					dp[j + 1] = false;
				}
			}
		}
		return res;
	}
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/966339.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号