先看题目:

给定凸n边形P = {1,2,,,n},每一个顶点i带一个权数r(i)(i = 1,2,,,n)。要求在该凸n边形的顶点间连n-3条互不相交的连线,
把凸N边形分成n-2个三角形,每个三角形的值为其三个顶点权数之积。试确定一种三角形剖分,使得剖分的n-2个三角形的值之和最小。

如下图,凸6边形,顶点序号分别为1-6,顶点的权数未在图中标出。

这道题还是相当有难度的,第一次没做出来,看讲解懂了。第二次做的时候又卡在一个地方......,没理解透彻,就又看了一遍。稍微明白了。常规的动态规划类题目阶段都是很明显,比如说背包问题,每个物品就是一个阶段,但是本题目就不是那么明显了,至少对我来说。不清楚阶段没关系,继续做题,设i,j分别表示途中顶点,m[i][j]表示所划分的最大值,显而易见

m[i][i+2] = i * (i+1) * (i+2); m[i][j] = Max(m[i][k]+m[k][j]+i*j*k),其中i < k < j; 状态迁移方程是如此简洁,让多次思考没能想出的我有点怀疑智商,多看几遍也还是能够理解的,即便第一次不会,下一次遇到能够会做也行。这样的状态迁移方程和最长非降子数列问题类似。通过求解子问题,遍历得到最大值。边界情况就是m[i][i+1] = 0。利用此方法,上图的最优解是m[1][6],得到了最优解,需要知道最有子序列的值,这时候从后往前遍历顶点序列,找到最大的m[i][k],k即是分割点,接着递归遍历[i][k]和[k][j]即可。

此外的一个难点就是,虽然知道了状态迁移方程,但是要注意,求取m[i][j]的时候,需要先求出[i][k]和[k][j],这一点尤其值得注意,和普通的动态规划不一样,在设置循环的时候应该注意这点。

本题目略微有难度,看不懂的同学需要多多编码调试才行。

下面是c代码实现:

/**  N凸边形划分三角形,求所得所有的三角形顶点之积的最大值*  m[i][j] = MAX(m[i][k] + m[k][j] + a[i]*a[k]*a[j])*/#include <stdio.h>void showEdage(int (*p)[30], int i, int j)
{int k;k = p[i][j];if (j <= i + 1)return;if (k > i + 1)printf("%d - %d ", i, k);if (k < j - 1)   printf("%d - %d ", k, j);showEdage (p, i, k);showEdage (p, k, j);
}void main()
{int i, j, k, d, n, a[30] = {0}, m[30][30] = {0}, c[30][30] = {0};printf("input nTriangle's n:"); scanf("%d", &n);if (n > 30){printf("invalid n\n");return;}for (i = 0; i < n; i++){printf("input %d value:", i+1);scanf("%d", &a[i]);}printf("you input n :%d \nvertex: ",n);for (i = 0; i < n; i++)printf("%d ", a[i]);//边界初始化for (i = 0; i < n - 1; i++)m[i][i+1] = 0;//递推求解for (d = 2; d < n; d++)for (i = 0; i <= n - d - 1; i++){j = i + d;m[i][j] = 10000000;for (k = i + 1; k < j; k++){if (m[i][j] > m[i][k] + m[k][j] + a[i] * a[j] * a[k]){m[i][j] = m[i][k] + m[k][j] + a[i] * a[j] * a[k];c[i][j] = k;}          }       }//打印最优解printf("Min : %d\n", m[0][n-1]);showEdage (c, 0, n-1);
}

参考资料:

1. 数据结构 : C语言版/ 严蔚敏,吴伟民编著

=============================================================================================

Linux应用程序、内核、驱动开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。

动态规划 dp04 凸n边形的三角形划分 c代码相关推荐

  1. 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)

    [BZOJ5311/CF321E]贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性) 题面 BZOJ CF 洛谷 辣鸡BZOJ卡常数!!!!!! 辣鸡BZOJ卡常数!!!!!! ...

  2. 凸n边形的对角线最多能将其内部分成几个区域。

    凸n边形的对角线最多能将其内部分成几个区域. ----区域数Tn的递推式与通式 金鸣       凸n边形的对角线最多(即不存在3条对角线交于一点)能将其内部分成几个区域?这一问题虽然有过多种简例与讨 ...

  3. Java打印各种形状 心形 菱形 三角形 圆形

    Java打印各种形状 心形 菱形 三角形 圆形 public class TestPrint {/*** 打印*号*/public static void main(String[] args) {/ ...

  4. Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解

    Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...

  5. php绘制一个三角形,如何利用css或html5画出一个三角形?两种不同的制作三角形方法(代码实例)...

    我们在平时的前端开发的时候,有时候是需要一些小图形来丰富一下页面效果,比如:下拉列表的倒三角图形.那么这样的一个三角形是如何制作出来的,本章给大家介绍如何利用css或html画出一个三角形?两种不同的 ...

  6. python求三角形面积步骤_Python3计算三角形的面积代码

    关于Python语言,众说纷纭,但无外乎两种,强大,垃圾.大多数人还是对Python持肯定意见,认为它很强大.前些天和两个的大学同学聊天,一个是在做手机测试,一个是给银行系统做维护一类的工作,都在北京 ...

  7. h5画三角形_如何利用css或html5画出一个三角形?两种不同的制作三角形方法(代码实例)...

    我们在平时的前端开发的时候,有时候是需要一些小图形来丰富一下页面效果,比如:下拉列表的倒三角图形.那么这样的一个三角形是如何制作出来的,本章给大家介绍如何利用css或html画出一个三角形?两种不同的 ...

  8. php如何计算三角函数,使用Python三角函数公式计算三角形的夹角代码示例

    使用Python三角函数公式计算三角形的夹角代码示例 本篇文章小编给大家分享一下使用Python三角函数公式计算三角形的夹角代码示例,对大家的学习有一定的帮助,小编觉得挺不错的,现在分享给大家供大家参 ...

  9. C语言计算三角形面积参考代码

    C语言计算三角形面积参考代码 编译器:Visual Studio 2022 #include<stdio.h> main(void) {float a, s, d; //定义变量 a做底, ...

最新文章

  1. 七自由度车辆稳定性数学模型和simulink求解
  2. oracle数据库path,利用Path环境变量解决oracle数据库和owb工具不兼容问题!
  3. php并行运算,php多进程并行执行脚本的代码
  4. 兼容所有浏览器的设为首页收藏本站js代码,推荐使用
  5. java动态类加载_实现Java动态类载入机制
  6. aria2百度网盘 http返回头无效_接口测试第10期:Fiddler中查看HTTP请求中的状态码...
  7. 【图像处理】MATLAB:表示与描述
  8. sympy 求微分方程_Sympy笔记一
  9. FDDB评估工具使用
  10. python汇率兑换程序_Python中汇率兑换程序的实现,python
  11. 老九学堂 学习 C++ 第四天
  12. win7 匿名共享目录
  13. PostgreSQL 简介
  14. EasySwoole3 Crontab的使用
  15. 烟台有线电视频率与节目表
  16. matlab单边带调制仿真,000单边带调制MATLAB模拟仿真
  17. 协同过滤推荐算法及应用
  18. C++中pow()函数
  19. 心情日志 —— 2015/09/09
  20. 智解京东618——购物狂欢背后的安全暗战

热门文章

  1. 9月——都已经9月了还不好好刷题?。。
  2. 【转】C# using的三种使用方法
  3. oracle密码加密工具下载,oracle加密工具wrap
  4. 2.7 RMSprop-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  5. 1.2 偏差/方差-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  6. 2.4带通采样的实际问题
  7. 反激式开关电源中PC817与TL431的配合电路探讨
  8. STM32的ISP升级详解
  9. 从配置服务器说起......
  10. 【Android】3.12 兴趣点( POI)搜索功能