递推 N三角形问题

Description

用N个三角形最多可以把平面分成几个区域?

Input

输入数据的第一行是一个正整数T(1<=T<=10000),表示测试数据的数量.然后是T组测试数据,每组测试数据只包含一个正整数N(1<=N<=10000).

Output

对于每组测试数据,请输出题目中要求的结果.

Sample Input

2
1
2

Sample Output

2
8

解题:   利用公式  t(1)=2t(n)=t(n-1)+6*(n-1)

公式推倒如下:

平面本身是1部分.一个三角形将平面分成三角形内、外2部分,即增加了1部分,
两个三角形不相交时将平面分成3部分,相交时,交点越多分成的部分越多(见下图);

由上图看出,新增加的部分数与增加的交点数相同,所以,再画第3个三角形时,应使每条边的交点尽量多;
对于每个三角形,因为1条直线最多与三角形的两条边相交,所以第3个三角形的每条边最多与前面2个三角形的各两条边相交,共可产生3×(2×2)=12(个)交点,即增加12部分;
因此,3个三角形最多可以把平面分成:1+1+6+12=20(部分);
由上面的分析,当画第n(n≥2)个三角形时,每条边最多与前面已画的(n-1)个三角形的各两条边相交,
共可产生交点:3×[(n-l)×2]=6(n-1)(个),能新增加6(n-1)部分,
因为1个三角形时有2部分,所以n个三角形最多将平面分成的部分数是:
2+6×[1+2+…+(n-1)]=2+6×n(n-1)/2=2+3n(n-1)

 
 

最后打表输出。

代码如下:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
    int n,m;
    long long a[10005];
   a[1]=2;
   for(int i=2;i<=10000;i++)
   a[i]=a[i-1]+6*(i-1);
   scanf("%d",&n);
   while (n--)
    {
        scanf("%d",&m);
        printf("%d\n",a[m]);

     }
 return 0;

}

  

时间: 2024-11-09 01:48:18

递推 N三角形问题的相关文章

hdu 1249 三角形 (递推)

三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4390    Accepted Submission(s): 2957 Problem Description 用N个三角形最多可以把平面分成几个区域? Input 输入数据的第一行是一个正整数T(1<=T<=10000),表示测试数据的数量.然后是T组测试数据,每组测试数据只

数字三角形——递归、递推、记忆化搜索

数字三角形 描述: 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外没个数的左下方和右下方各有一个数. 问题: 从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来.如何走才能使得这个和尽量大? 分析: 不难看出此题是一个动态的决策问题:每次有两种选择--左下或右下.如果用回溯法求出所有的可能的路线,就可以从中选出最优的路线.但和往常一样,回溯法的效率太低:一个n层数字三角形的完整路线有2^n条,当n很大时回溯法的速度将让人无法忍受.因此本题讨论用

动态规划 数字三角形(递归,递推,记忆化搜索)

题目要求: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的数字三角形中寻找在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径. 三角形的行数大于1小于等于100,数字为 0 - 99 输入格式: 5 //三角形行数.下面是三角形 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 解题思路: 用二维数组存放数字三角形 D[r][j] //表示第i行第j个元素的

递归,递推,记忆化搜索,空间优化(数字三角形)

题目链接:http://poj.org/problem?id=1163 1.递归思想:第一层到最底层的最优路径可以分解为:第一层到第二层来,再加上第二层的最优路径 状态: Time Limit Exceeded #include <algorithm> #include <stdio.h> #define MAX 101 using namespace std; int maps[MAX][MAX]; int n; int Sum(int i,int j) { if(i==n) r

三角形问题——(递归,递推,动态规划)

1. 用递归的方法来解决这个问题 2. 带记忆的递归(将那些已经计算过的点直接返回值)这里递归的时候,将那些计算过在它之下的最大路径的值保存起来,下次 再用的时候直接查看就可以了 #include<iostream> #include <vector> #include <string> using namespace std; #define MAXLINE 100 int vec[MAXLINE][MAXLINE]; int maxsum[MAXLINE][MAXL

动态规划&mdash;&mdash;数字三角形(递归or递推or记忆化搜索)

动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个状态定义下,原问题的解就是d(i,j). 下面看一下不同状态之间如何转移.从格子(i,j)出发有两种策略.如果向左走,则到(i+1,j)后需要求"从(i+1,j)出发能得到的最大和"这一问题,即d(i+1,j). 类似的,往右走之后需要求解d(i+1,j+1).由于可以在这两个决策中自由选

hdu 1396 Counting Triangles (递推)

Counting Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2012    Accepted Submission(s): 966 Problem Description Given an equilateral triangle with n the length of its side, program to

hdu4165(简单递推,实则卡特兰数的应用)

这道题之前自己做的时候并没有反应过来是求卡特兰数,当时是按递推来想的.后来查了下HDU4165,结果一看大标题就说是卡特兰数,自己想了想,还真是那么回事.主要还是对于卡特兰数用的不多,也就当时没立马反应过来了.下面介绍这道题我的思路,然后对卡特兰数再做一些补充. 本题题意:罐子里有N片相同的药片,开始的时候药片都是完整的一整片.然后一个每天从中任意取一片,如果该药片是完整的一整片,那么他会吃点半片,然后将剩余半片扔回罐里,如果恰好是半片,那他直接吃掉拿出来的半片.显然2N天后,他吃完全部N片药片

算法--递推策略

本文地址:http://www.cnblogs.com/archimedes/p/4265019.html,转载请注明源地址. 递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法.这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推.无论顺推还是逆推,其关键是要找到递推式.这种处理问题的方法能使复杂