三角形相关算法

1、数组中能组成三角形的数目

int triangleCount(vector<int> &S) {
              // write your code here
              int iSize = S.size();
              if (iSize <= 2)
              {
                     return 0;
              }
              int sum = 0;
              sort(S.begin(), S.end());
              for (int i = 2; i < iSize; i++)
              {
                     int posLeft = 0;
                     int posRight = i - 1;
                     int c = S.at(i);
                     while (posLeft < posRight)
                     {
                           if (S.at(posLeft) + S.at(posRight) <= c)
                                  posLeft++;
                           else if (S.at(posLeft) + S.at(posRight) > c)
                           {
                                  sum += posRight - posLeft;
                                  posRight--;
                           }
                                  
                     }
              }
              return sum;
       }

2、数组三角形
如下图示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;
在这里插入图片描述
分析:这里不妨采取递推的想法,从底部开始记录,运用动态规划的想法(追求子问题的最优解),逐步向上更新数字三角形的值,最终的答案就是塔顶的值:递推关系式,也是dp方程:num[i][j] += max(num[i+1][j], num[i+1][j+1]

我们可以先从特殊情况来考虑本题,这道题最大的变数就在于数塔的层数,那么这就是突破口:
1、假设数塔只有一层,答案很显然
2、假设数塔有两层,那么就将第二层大一点的值增加到第一层,求得答案
3、假设数塔有三层,按照代码的思路,先更新倒数第二行,我们一个值一个值的更新,每一个值结合下面一层都会有自己的两层小数塔.

#include <stdio.h>
#include <string.h>
#include <string>
#include <algorithm> //包含max()函数的头文件
using namespace std;
int num[101][101]; //记录数塔
int main(){
	int n;
	while(scanf("%d", &n) != EOF){
		memset(num, 0, sizeof(num)); //初始化数塔
		for(int i=1; i<=n; i++){
			for(int j=1; j<=i; j++){
				scanf("%d", &num[i][j]); //数塔初值
			}
		}
		for(int i=n-1; i>=1; i--){ //注意是从倒数第二层开始更新的(最后一层没有必要)
			for(int j=1; j<=i; j++){
				num[i][j] += max(num[i+1][j], num[i+1][j+1]); //dp方程,来历可以自己先想想,文末是个人想法
			}
		}
		printf("%d\n", num[1][1]);
	}
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值