动态规划初级 入门理解 C#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Microsoft.Practices.EnterpriseLibrary.Validation; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args) { int[] arr = new int[] {10,5,3,6,8,9,7};
int[] recode = new int[arr.Length];
recode[0] = 1;
//求数组中最长非降 子序列
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] > arr[i - 1])
recode[i] = recode[i-1]+1;
else
recode[i] = recode[i-1]; }
for (int i = 0; i < recode.Length ; i++)
{
Console.WriteLine("到第"+(i+1)+"元素的最长非降 子序列长度:"+recode[i]);
}
Console.Read(); }
} }
执行结果 :这里保存了到某个长度下的所有状态 如果不需要 完全可以用int变量存储 不需要使用数组 这样复杂度分别为 o(n),o(1)

问题
一个序列有N个数:A[1],A[2],…,A[N],求出最长非降子序列的长度
分析 我先用列举法考虑简单情况 然后找规律
第一个元素最长非降序列长度肯定为1 因为只有本身 没有比较对象 记为 f(1)=1
到第二个元素 与第一个元素进行对比 如果小于第一个元素 那么这里第二个元素并没有为长度做出贡献 状态还保持在上一个元素 记 f(2)=1=f(1)
以此类推
最后得到以上结果
这是我对动态规划的入门理解 即之前最优的状态影响着当前状态 而上一个状态就是在这之前的最优状态 这样也能降低算法的复杂程度
第二例

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Microsoft.Practices.EnterpriseLibrary.Validation; namespace ConsoleApplication1
{
public class NodeDistance
{
/// <summary>
/// 节点名称
/// </summary>
public string nodeName { get; set; }
/// <summary>
/// 能到达的节点及与他们的距离列表
/// </summary>
public List<(string nodeName, int distance)> distance { get; set; } }
class Program
{
//记录已到达的(走到当前的)最短路径
static (string lujin, int distance) luxianDaoDa = ("", int.MaxValue); static void Main(string[] args)
{ // 问题 无向图上有N(1<N)个节点 每个节点有任意长的距离 计算任意节点A到任意节点B的距离
//使用二维数组模拟点的情况 以及单个点到其他点的距离 先从简单的情况开始考虑 有abcd四个节点 每个节点可以到达其他节点 List<NodeDistance> nodeList = new List<NodeDistance>() {
new NodeDistance
{
nodeName="a",
distance=new List<(string nodeName, int distance)>{
("b",2),("c",7),("c",7)
}
},
new NodeDistance
{
nodeName="b",
distance=new List<(string nodeName, int distance)>{
("a",2),("c",3),("d",2)
}
},
new NodeDistance
{
nodeName="c",
distance=new List<(string nodeName, int distance)>{
("a",7),("d",5),("b",3)
}
},
new NodeDistance
{
nodeName="d",
distance=new List<(string nodeName, int distance)>{
("a",6),("c",3),("b",2)
}
}, };
List<(string lujin, int distance)> luxian = new List<(string lujin, int distance)>(); //求a-c得最短路径
CalcDistance("a", "c", "a", 0, nodeList);
Console.WriteLine("最短路径:" + luxianDaoDa.lujin + "距离为:" + luxianDaoDa.distance);
Console.Read(); } /// <summary>
/// 计算距离
/// </summary>
/// <param name="node">当前节点</param>
/// <param name="endChar">结束位置</param>
public static void CalcDistance(string startChar, string endChar, string luxianName, int distance, List<NodeDistance> nodeList)
{
var node = nodeList.Where(u => u.nodeName == startChar).FirstOrDefault();
//记录走过的节点
foreach (var item in node.distance)
{
//判断当前节点是否走过 或者是否为起点
if (item.nodeName == "a") continue;
luxianName += item.nodeName;
// 判断是否为当前情况下的最优状态 如果是 判断是否为终点
distance += item.distance;
if (distance >= luxianDaoDa.distance) continue;
if (item.nodeName == endChar)
luxianDaoDa = (luxianName, distance);
else
CalcDistance(item.nodeName
, endChar, luxianName, distance, nodeList); } } } }
运行结果

抽屉取苹果
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Microsoft.Practices.EnterpriseLibrary.Validation; namespace ConsoleApplication1
{ class Program
{ static int[][] apple = new int[3][];
static int[][] appleSum = new int[3][]; static void Main(string[] args) {
apple[0] = new int[] {3,2,4};
apple[1] = new int[] { 2,1,3 };
apple[2] = new int[] { 6,5,1};
appleSum[0] = new int[apple[0].Length];
appleSum[1] = new int[apple[0].Length];
appleSum[2] = new int[apple[0].Length]; appleSum[0][0] = apple[0][0];//初始只能取到本身
//先填充第一行与第一列
for (int i = 1; i < apple.Length; i++)
{
appleSum[0][i] = appleSum[0][i - 1] + apple[0][i];
appleSum[i][0] = appleSum[i-1][0] + apple[i][0]; }
//当前位置记为array[x][y] 然后填充其他行与列 值为max(array[x+1][y],array[x][y+1])
for (int x = 1; x < apple.Length; x++)
for (int y = 1; y < apple[0].Length; y++)
appleSum[x][y]= (appleSum[x - 1][y] > appleSum[x][y - 1] ? appleSum[x - 1][y] : appleSum[x][y - 1])+apple[x][y]; Console.WriteLine("最大值:"+appleSum[apple.Length-1][apple[0].Length-1]); Console.Read();
} } }


具体分析 http://www.cnblogs.com/lihonglin2016/p/4298432.html
动态规划初级 入门理解 C#代码的更多相关文章
- Sping AOP初级——入门及简单应用
在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是和业 ...
- Spring AOP初级——入门及简单应用
在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是 ...
- mui初级入门教程(四)— 再谈webview,从小白变“大神”!
文章来源:小青年原创发布时间:2016-06-05关键词:mui,html5+,webview转载需标注本文原始地址: http://zhaomenghuan.github.io/#!/blog/20 ...
- mui初级入门教程(三)— html5+ XMLHttpRequest 与mui ajax用法详解
文章来源:小青年原创发布时间:2016-05-29关键词:mui,html5+,XMLHttpRequest,ajax,懒加载转载需标注本文原始地址: http://zhaomenghuan.gith ...
- 响应式Web初级入门
本文来自我的前端博客,原文地址:http://www.hacke2.cn/about-responsive/ 跨终端时代的到来 当你乘坐各种交通工具(公交.地铁.轻轨.火车)时你会发现,人们都个个低下 ...
- hadoop入门手册5:Hadoop【2.7.1】初级入门之命令:文件系统shell2
问题导读 1.改变hdfs文件的权限,需要修改哪个配置文件?2.获取一个文件的或则目录的权限,哪个命令可以实现?3.哪个命令可以实现设置访问控制列表(ACL)的文件和目录? 接上篇:Hadoop[2. ...
- hadoop入门手册4:Hadoop【2.7.1】初级入门之命令:文件系统shell1
问题导读1.Hadoop文件系统shell与Linux shell有哪些相似之处?2.如何改变文件所属组?3.如何改变hdfs的文件权限?4.如何查找hdfs文件,并且不区分大小写? 概述文件系统 ( ...
- hadoop入门手册3:Hadoop【2.7.1】初级入门之命令指南
问题导读1.hadoop daemonlog管理员命令的作用是什么?2.hadoop如何运行一个类,如何运行一个jar包?3.hadoop archive的作用是什么? 概述 hadoop命令被bin ...
- Spring Cloud实战之初级入门(六)— 服务网关zuul
目录 1.环境介绍 2.api网关服务 2.1 创建工程 2.3 api网关中使用token机制 2.4 测试 2.5 小结 3.一点点重要的事情 1.环境介绍 好了,不知不觉中我们已经来到了最后一篇 ...
随机推荐
- 【数论】【中国剩余定理】【LCM】hdu1788 Chinese remainder theorem again
根据题目容易得到N%Mi=Mi-a. 那么可得N%Mi+a=Mi. 两侧同时对Mi取余,可得(N+a)%Mi=0. 将N+a看成一个变量,就可以把原问题转化成求Mi的LCM,最后减去a即可. #inc ...
- Java并发(四):happens-before
happens-before 一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系 happen-before原则是JMM中非常重要的原则,它是判断数据是 ...
- CentOS 6.9下iptables通过raw表实现日志输出和调试
说明:iptables调试的最好方式应该是输出日志了.并且iptables有个raw的表,优先级别最好,且调试时针对icmp协议(ping)进行,那么日志输出就是整条链路串起来输出的,非常的清晰. 前 ...
- js:输入字数限制
Demo <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- linux面试题目—2
linux面试题目—2 二 选择题 1.关闭linux系统(不重新启动)可使用命令 B . A Ctrl+Alt+Del B halt C shutdown -r now D reboot 2.实现从 ...
- linux gcc升级备忘录
1. 拉包 sudo wget http://mirrors.opencas.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2 #如果以上给出的镜像不可用,也可以是使用h ...
- 三种主流的Web服务实现方案(REST+SOAP+XML-RPC)简述及比较
目前知道的三种主流的Web服务实现方案为:REST:表象化状态转变 (软件架构风格)SOAP:简单对象访问协议 XML-RPC:远程过程调用协议 下面分别作简单介绍: REST:表征状态转移(Repr ...
- OTL调用存储过程/函数及注意事项
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个 C++ 编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库. OTL ...
- [视频解说]Java(JDK的下载安装及第一个程序执行)
(JDK的下载安装及第一个程序执行) 内容:Java JDK 的安装以及HelloWorld 程序的执行 欢迎童鞋们前往围观 http://v.youku.com/v_show/id_XODA3Mzk ...
- 【实践】用 js 封装java shuffle函数(打乱数组下标方法)
此方法返回的会是一个全新的数组 所以并不会像java里的shuffle函数一样返回一个引用一样的数组 思路如下: 1.新建一个函数传入需要打乱下标的数组 2.获取数组的长度 3.新建一个用来保存并且返 ...