洛谷P1118 [USACO06FEB]数字三角形 搜索

洛谷P1118 [USACO06FEB]数字三角形Backward Digit Su…     搜索

这题我们发现每一个位置的加权就是 杨辉三角 yh[ n ][ i ]
然后我们就可以求 n! 暴力 ,但是会 TLE 额 好像是会T 因为12! 已经 4亿了
然后我们加一个强力剪枝 如果当前求出来的 s 已经大于 sum了,因为没有负的加
权,也就是说这一路是没有用了的,在继续搜下去也不能更新答案了,那么就直接退出 。

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <iostream>
 7 #include <iomanip>
 8 #include <algorithm>
 9 using namespace std ;
10
11 int n,sum ;
12 int ans[13],yh[13][13] ;
13 bool finished ;
14 bool used[13] ;
15
16 inline void dfs(int p,int s)
17 {
18     if(p>n)
19     {
20         if(s==sum)
21         {
22             finished = 1 ;
23             for(int i=1;i<=n;i++) printf("%d ",ans[ i ]) ;
24             exit(0) ;
25         }
26         return ;
27     }
28     for(int i=1;i<=n;i++)
29     {
30         if(!used[ i ])
31         {
32             if(s+yh[n][p]*i>sum) continue ;     //剪枝  即不能更新答案了
33             ans[ p ] = i ;
34             used[ i ] = 1 ;
35             dfs(p+1,s+yh[n][p]*i) ;
36             used[ i ] = 0 ;
37         }
38     }
39 }
40
41 int main()
42 {
43     scanf("%d%d",&n,&sum) ;
44     yh[1][1] = 1 ;
45     for(int i=2;i<=n;i++)
46         for(int j=1;j<=i;j++)
47             yh[ i ][ j ] = yh[ i-1 ][ j-1 ]+yh[ i-1 ][ j ] ;
48
49     dfs(1,0) ;
50
51     return 0 ;
52 }
时间: 2024-10-10 20:38:45

洛谷P1118 [USACO06FEB]数字三角形 搜索的相关文章

做题记录: P1118 [USACO06FEB]数字三角形Backward Digit Su…

P1118 [USACO06FEB]数字三角形Backward Digit Su- /*思路:设一开始的n个数为a1.a2.a3...an, 一步一步合并就可以用a1..an表示出最后剩下来 的数,不难发现其中a1..an的系数恰好就是第n层 杨辉三角中的数.所以我们可以先处理出第n层杨 辉三角中的数,然后根据这一层中的数搜索即可.*/ #include<iostream> #include<cstdio> #include<fstream> #include<a

P1118 [USACO06FEB]数字三角形Backward Digit Su…

P1118 [USACO06FEB]数字三角形Backward Digit Su… 题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They rep

[luogu p1118] [USACO06FEB]数字三角形

题面 题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from \(1\) to$ N(1 \le N \le 10)$ in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single numb

P1118 [USACO06FEB]数字三角形`Backward Digit Su`…

题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from 11 to N(1 \le N \le 10)N(1≤N≤10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single num

P1118 [USACO06FEB]数字三角形`Backward Digit Su`… 回溯法

有这么一个游戏: 写出一个11至NN的排列a_iai?,然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少11,直到只剩下一个数字位置.下面是一个例子: 3,1,2,43,1,2,4 4,3,64,3,6 7,97,9 1616 最后得到1616这样一个数字. 现在想要倒着玩这样一个游戏,如果知道NN,知道最后得到的数字的大小sumsum,请你求出最初序列a_iai?,为11至NN的一个排列.若答案有多种可能,则输出字典序最小的那一个. [

洛谷P2327 [SCOI2005]扫雷 枚举 搜索

洛谷P2327 [SCOI2005]扫雷 枚举 搜索 对搜索的 一些优化 其实我们只要枚举第一行是否有地雷,根据第1行探测出的地雷数,就可以推出第二行是否有地雷 然后在根据第二行探测地雷数推出第三行的情况,这样以此类推,一直推到第 n-1 的探测结果,然后 推出第 n 行是否有地雷如果在推的过程中 使得当前的探测地雷数为 负数 ,说明这个方法是萎的, 或者这一行推完了之后,还是有雷,那也退出,最后还要判断一下第 n 行是否有地雷 1 #include <cstdio> 2 #include &

洛谷P1118 数字三角形游戏

洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一个例子:     3   1   2   4       4   3   6         7   9          16 最后得到16这样一个数字. 现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1-N的一个

洛谷P1019单词接龙 搜索

洛谷P1019 单词接龙 这道题目 我用的是搜索 应为起点已经确认了,那就从这开始搜索,如果能接上去就接上去,回溯一下需要注意的就是一些细节问题,比方说不能被另一个单词完全覆盖等等 以及字符串是从零开始的问题 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdlib> 5 #include <string> 6 #include <a

洛谷P3166 [CQOI2014]数三角形

题目描述 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形.注意三角形的三点不能共线. 输入输出格式 输入格式: 输入一行,包含两个空格分隔的正整数m和n. 输出格式: 输出一个正整数,为所求三角形数量. 输入输出样例 输入样例#1: 2 2 输出样例#1: 76 数据范围 1 ---------------------------------------------------------------------------------- 这道题呢