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#代码的更多相关文章

  1. Sping AOP初级——入门及简单应用

    在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是和业 ...

  2. Spring AOP初级——入门及简单应用

      在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是 ...

  3. mui初级入门教程(四)— 再谈webview,从小白变“大神”!

    文章来源:小青年原创发布时间:2016-06-05关键词:mui,html5+,webview转载需标注本文原始地址: http://zhaomenghuan.github.io/#!/blog/20 ...

  4. mui初级入门教程(三)— html5+ XMLHttpRequest 与mui ajax用法详解

    文章来源:小青年原创发布时间:2016-05-29关键词:mui,html5+,XMLHttpRequest,ajax,懒加载转载需标注本文原始地址: http://zhaomenghuan.gith ...

  5. 响应式Web初级入门

    本文来自我的前端博客,原文地址:http://www.hacke2.cn/about-responsive/ 跨终端时代的到来 当你乘坐各种交通工具(公交.地铁.轻轨.火车)时你会发现,人们都个个低下 ...

  6. hadoop入门手册5:Hadoop【2.7.1】初级入门之命令:文件系统shell2

    问题导读 1.改变hdfs文件的权限,需要修改哪个配置文件?2.获取一个文件的或则目录的权限,哪个命令可以实现?3.哪个命令可以实现设置访问控制列表(ACL)的文件和目录? 接上篇:Hadoop[2. ...

  7. hadoop入门手册4:Hadoop【2.7.1】初级入门之命令:文件系统shell1

    问题导读1.Hadoop文件系统shell与Linux shell有哪些相似之处?2.如何改变文件所属组?3.如何改变hdfs的文件权限?4.如何查找hdfs文件,并且不区分大小写? 概述文件系统 ( ...

  8. hadoop入门手册3:Hadoop【2.7.1】初级入门之命令指南

    问题导读1.hadoop daemonlog管理员命令的作用是什么?2.hadoop如何运行一个类,如何运行一个jar包?3.hadoop archive的作用是什么? 概述 hadoop命令被bin ...

  9. Spring Cloud实战之初级入门(六)— 服务网关zuul

    目录 1.环境介绍 2.api网关服务 2.1 创建工程 2.3 api网关中使用token机制 2.4 测试 2.5 小结 3.一点点重要的事情 1.环境介绍 好了,不知不觉中我们已经来到了最后一篇 ...

随机推荐

  1. FutureTask源码分析

    1. 常量和变量 private volatile int state; // 任务状态 private static final int NEW = 0; private static final ...

  2. php根据汉字获取拼音(php基于拼音搜索实现原理)

    php根据汉字获取拼音(php基于拼音搜索实现原理) 代码一:获取字符串汉字首字母,兼容GBK和UTF-8 <?php function getfirstchar($s0){   //获取单个汉 ...

  3. rman catalog配置简要笔记

    服务端配置: SQL> create tablespace tbs_rman datafile 'H:\oradata\test\tbs_rman.dbf' size 20m autoexten ...

  4. 让Code First下的数据库的迁移更加简单

    Code First给我们的程序开发带了很多便利,之前的版本中一个比较不大方便的地方是数据库迁移,麻烦不说,往往还和上下文相关,在不同的版本之间的数据库进行迁移还很容易失败,并且一旦失败还不大容易找到 ...

  5. Linux PHP 编译参数详解(二)

    对于喜欢玩开源软件的童鞋么,都喜欢自己编译安装程序,本文说明下如何编译安装php的详细参数. 示例: ./configure \ --prefix=/usr/local/php --with-zlib ...

  6. 自定义Cell引发的悲剧。。。。

    这两天毕设,昨晚微调自定义的cell,之前用mrc的时候直接打开xib布局好自定义cell就行乐,不用去勾选Use Autolayout,可是昨晚开始,自定义cell中,label不能动态调高的问题, ...

  7. linq直接执行sql语句

    1.ExecuteQuery方法 看命名,我们很容易联想到ado.net里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告诉我们这个方法返回的是一个泛型集合,应该&quo ...

  8. iOS:ShareSDk的分享

    使用分享类的SDK其实有很多,例如友盟.ShareSDK等等,参照他们的文档集成起来并不是很难,可能出的一些问题也就是配置文件的问题,这里我个人使用了ShareSDK分享,具体操作可出现的问题如下: ...

  9. iOS:iOS开发系列–打造自己的“美图秀秀”(中)

    来源: KenshinCui 链接:http://www.cnblogs.com/kenshincui/p/3959951.html 其他状态设置 常用的图形上下文状态设置上面基本都用到了,我们不再一 ...

  10. 对REST的理解

    现在标准服务基本都提供REST化的接口了.为了加强对REST的理解,看了这篇文章: http://kb.cnblogs.com/page/186516/ REST架构风格最重要的架构约束有6个: 客户 ...