-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path!-cutting.cpp
114 lines (101 loc) · 2.05 KB
/
!-cutting.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
===========================================================
* @名称: 算法导论——切割钢条
* @作者: Shawn
* @创建时间: 2018-04-23 20:32:08
* @修改人: Shawn
* @修改时间: 2018-04-23 20:32:08
* @备注:
* @题目来源: 《算法导论》第15章
===========================================================
*/
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
void solve1()
{
while (true)
{
int n;
cin >> n;
vector<int> dp(n + 1);
vector<int> p = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
int sizeP = p.size() - 1;
dp[0] = 0; dp[1] = 1;
for (int i = 1; i <= n; ++i)
{
if (i <= sizeP)
{
dp[i] = p[i];
}
else
{
dp[i] = 0;
}
int j = 0, k = i;
while (j <= k)
{
dp[i] = max(dp[i], dp[i - j] + dp[j]);
++j; --k;
}
}
cout << dp[n] << '\n';
}
}
vector<int> dp2(10000, -1);
vector<int> p2 = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
int sizeP2 = p2.size() - 1;
int solve2(int n)
{
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
else if (dp2[n] != -1)
{
return dp2[n];
}
else
{
int j = 1, k = n - 1;
int ans;
if (n <= sizeP2)
{
ans = p2[n];
}
else
{
ans = 0;
}
while (j <= k)
{
ans = max(ans, solve2(n - j) + solve2(j));
++j; --k;
}
dp2[n] = ans;
return ans;
}
}
int main()
{
// while (true)
// {
// int n;
// cin >> n;
// cout << solve2(n) << '\n';
// }
solve1();
return 0;
}