前言
这题感觉蓝桥杯测评系统有点问题
一、题目
二、思路
动态规划,DFS记忆化搜索。
1.状态:f[i]表示YBH[i]的最大值
2.下一个状态:由题意得,从YBH[i]可以有四种操作,YBH[i]–>YBH[i+4],YBH[i]–>YBH[i+5],YBH[i]–>YBH[4i],YBH[i]–>YBH[5i]。当然也可以从YBH[i]–>YBH[i+8/9/12…],我们选择最小的这四个操作。
3.变化:YBH[i]–>YBH[i+4],f[i]–>f[i]+YBH[4];YBH[i]–>YBH[i+5],f[i]–>f[i+5]+YBH[5];YBH[i]–>YBH[i*4],f[i]–>f[i]YBH[4];YBH[i]–>YBH[i5],f[i]–>f[i]*YBH[5];其他类似。
void dfs(ll id,ll num){
//cout<<"this is "<<id<<endl;
if(id==n){
F=max(F,num);
return;
}
if(f[id]==0){
f[id]=num;
}
else{//f[id]!=0
if(num<=f[id]){
return;
}
else{//num>f[id]
f[id]=num;
}
}
if(id>=n+1)return;
//1
if(id+4<=n)dfs(id+4,num+5);
//2
if(id+5<=n)dfs(id+5,num+8);
//3
if(id*4<=n)dfs(id*4,num*5);
//4
if(id*5<=n)dfs(id*5,num*8);
}
由于要求最大得YBH[n],所以每次算到一个YBH[n]取max。
if(id==n){
F=max(F,num);
return;
}
利用f[i]实现记忆化搜索。由于每个状态比如YBH[17]会被搜索很多次,因此DFS到达某一个状态i,如果当前得到的num值小于等于f[i],则继续搜下去得到得f[n]肯定不如此时的f[n]好,直接return。
代码:
代码如下(示例):
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
ll n;
ll f[maxn];
ll F=-1;//0 没有意义
ll ans[1007]={-1,-1,-1,-1,-1,-1,-1,-1,10,13,16,-1,15,18,21,24,25,23,26
,29,40,33,31,34,45,64,41,39,50,69,72,49,55,74
,77,80,65,79,82,85,88,84,87,90,93,104,92,95,98
,109,128,100,103,114,133,136,108,119,138,141,144,124,143,146,149,152,148,151,154,157,168,156,159,162,173,192,164,167,178,197,200,172,183,202,205,208,188,207,210,213,216,212,215,218,221,232,225,223,226,237,320,233,231,242,325,328,241,247,330,333,336,252,335,338,341,344,345,343,346,349,360,353,351,354,365,512,361,359,370,517,520,369,375,522,525,528,385,527,530,533,536,532,535,538,541,552,540,543,546,557,576,548,551,562,581,584,556,567,586,589,592,572,591,594,597,600,596,599,602,605,616,604,607,610,621,640,612,615,626,645,648,620,631,650,653,656,636,655,658,661,664,660,663,666,669,680,668,671,674,685,704,676,679,690,709,712,684,695,714,717,720,700,719,722,725,728,724,727,730,733,744,732,735,738,749,832,740,743,754,837,840,748,759,842,845,848,764,847,850,853,856,852,855,858,861,872,860,863,866,877,1024,868,871,882,1029,1032,876,887,1034,1037,1040,892,1039,1042,1045,1048,1044,1047,1050,1053,1064,1052,1055,1058,1069,1088,1060,1063,1074,1093,1096,1068,1079,1098,1101,1104,1084,1103,1106,1109,1112,1108,1111,1114,1117,1128,1116,1119,1122,1133,1152,1124,1127,1138,1157,1160,1132,1143,1162,1165,1168,1148,1167,1170,1173,1176,1172,1175,1178,1181,1192,1180,1183,1186,1197,1216,1188,1191,1202,1221,1224,1196,1207,1226,1229,1232,1212,1231,1234,1237,1240,1236,1239,1242,1245,1256,1244,1247,1250,1261,1344,1252,1255,1266,1349,1352,1260,1271,1354,1357,1360,1276,1359,1362,1365,1368,1364,1367,1370,1373,1384,1372,1375,1378,1389,1536,1380,1383,1394,1541,1544,1388,1399,1546,1549,1552,1404,1551,1554,1557,1560,1556,1559,1562,1565,1576,1564,1567,1570,1581,1600,1572,1575,1586,1605,1608,1580,1591,1610,1613,1616,1596,1615,1618,1621,1624,1625,1623,1626,1629,1640,1633,1631,1634,1645,1664,1641,1639,1650,1669,1672,1649,1655,1674,1677,1680,1665,1679,1682,1685,1688,1684,1687,1690,1693,1704,1692,1695,1698,1709,1728,1700,1703,1714,1733,1736,1708,1719,1738,1741,1744,1724,1743,1746,1749,1752,1748,1751,1754,1757,1768,1756,1759,1762,1773,1856,1764,1767,1778,1861,1864,1772,1783,1866,1869,1872,1788,1871,1874,1877,1880,1876,1879,1882,1885,1896,1884,1887,1890,1901,2560,1892,1895,1906,2565,2568,1900,1911,2570,2573,2576,1916,2575,2578,2581,2584,2585,2583,2586,2589,2600,2593,2591,2594,2605,2624,2601,2599,2610,2629,2632,2609,2615,2634,2637,2640,2625,2639,2642,2645,2648,2644,2647,2650,2653,2664,2652,2655,2658,2669,2688,2660,2663,2674,2693,2696,2668,2679,2698,2701,2704,2684,2703,2706,2709,2712,2708,2711,2714,2717,2728,2716,2719,2722,2733,2752,2724,2727,2738,2757,2760,2732,2743,2762,2765,2768,2748,2767,2770,2773,2776,2772,2775,2778,2781,2792,2785,2783,2786,2797,2880,2793,2791,2802,2885,2888,2801,2807,2890,2893,2896,2812,2895,2898,2901,2904,2905,2903,2906,2909,2920,2913,2911,2914,2925,4096,2921,2919,2930,4101,4104,2929,2935,4106,4109,4112,2945,4111,4114,4117,4120,4116,4119,4122,4125,4136,4124,4127,4130,4141,4160,4132,4135,4146,4165,4168,4140,4151,4170,4173,4176,4156,4175,4178,4181,4184,4180,4183,4186,4189,4200,4188,4191,4194,4205,4224,4196,4199,4210,4229,4232,4204,4215,4234,4237,4240,4220,4239,4242,4245,4248,4244,4247,4250,4253,4264,4252,4255,4258,4269,4288,4260,4263,4274,4293,4296,4268,4279,4298,4301,4304,4284,4303,4306,4309,4312,4308,4311,4314,4317,4328,4316,4319,4322,4333,4416,4324,4327,4338,4421,4424,4332,4343,4426,4429,4432,4348,4431,4434,4437,4440,4436,4439,4442,4445,4456,4444,4447,4450,4461,4608,4452,4455,4466,4613,4616,4460,4471,4618,4621,4624,4476,4623,4626,4629,4632,4628,4631,4634,4637,4648,4636,4639,4642,4653,4672,4644,4647,4658,4677,4680,4652,4663,4682,4685,4688,4668,4687,4690,4693,4696,4692,4695,4698,4701,4712,4700,4703,4706,4717,4736,4708,4711,4722,4741,4744,4716,4727,4746,4749,4752,4732,4751,4754,4757,4760,4756,4759,4762,4765,4776,4764,4767,4770,4781,4800,4772,4775,4786,4805,4808,4780,4791,4810,4813,4816,4796,4815,4818,4821,4824,4820,4823,4826,4829,4840,4828,4831,4834,4845,4928,4836,4839,4850,4933,4936,4844,4855,4938,4941,4944,4860,4943,4946,4949,4952,4948,4951,4954,4957,4968,4956,4959,4962,4973,5120,4964,4967,4978,5125,5128,4972,4983,5130,5133,5136,4988,5135,5138,5141,5144,5140,5143,5146,5149,5160,5148,5151,5154,5165,5184,5156,5159,5170,5189,5192,5164,5175,5194,5197,5200,5180,5199,5202,5205,5208,5204,5207,5210,5213,5224,5212,5215,5218,5229,5248,5220,5223,5234,5253,5256,5228,5239,5258,5261,5264,5244,5263,5266,5269,5272,5268,5271,5274,5277,5288,5276,5279,5282,5293,5312,5284,5287,5298,5317,5320,5292,5303,5322,5325,5328,5308,5327,5330,5333,5336,5332,5335,5338,5341,5352,5340,5343,5346,5357,5440,5348,5351,5362,5445,5448,5356,5367,5450,5453,5456,5372,5455,5458,5461,5464,5460,5463,5466,5469,5480,5468,5471,5474,5485,5632,
};
void dfs(ll id,ll num){
//cout<<"this is "<<id<<endl;
if(id==n){
F=max(F,num);
return;
}
if(f[id]==0){
f[id]=num;
}
else{//f[id]!=0
if(num<=f[id]){
return;
}
else{//num>f[id]
f[id]=num;
}
}
if(id>=n+1)return;
//1
if(id+4<=n)dfs(id+4,num+5);
//2
if(id+5<=n)dfs(id+5,num+8);
//3
if(id*4<=n)dfs(id*4,num*5);
//4
if(id*5<=n)dfs(id*5,num*8);
}
void init(){
F=-1;
int i;
for(i=1;i<=1000;i++){
f[i]=0;
}
}
int main(){
int n;
cin>>n;
cout<<ans[n]<<endl;
}
这里我是打表的,仍然过不了测评。这个题有问题。