/ 卡路里
Problem statement:
問題陳述:
Shivang is very foodie but he has a diet plan. He has an array of elements indicating the calorie of food he can consume on that day. In his diet plan, he can’t eat on for three consecutive days. But since Shivang is very foodie, so he decided to take as much as calorie while remembering the fact that he cannot eat on three consecutive days. Help him in finding the number of calories he could take.
Shivang是位美食家,但他有飲食計劃。 他具有一系列元素,這些元素指示他當天可以吃的食物的熱量。 在他的飲食計劃中,他連續三天不能進食。 但是由于Shivang是一位非常美食的人,因此他決定攝取盡可能多的卡路里,同時記住自己連續三天不能進食的事實。 幫助他找到可以攝取的卡路里數量。
Input:
輸入:
n i.e number of days. In the next line is n space-separated values of ai indicating the intake of calorie per day.
n即天數。 在下一行中, i的 n個以空格分隔的值表示每天的卡路里攝入量。
Output:
輸出:
Print the maximum amount of calorie, Shivang can take in a new line.
打印最大卡路里,Shivang可以換行。
Constraints:
限制條件:
1<=n<=100000
1<=ai<=100000
Example:
例:
Input:
2
n=5
Array input, calorie for each day:
3 2 1 10 3
Output:
18
Explanation:
Shivang will eat on 1st, 2nd, 4th and 5th day
So, total he intakes 18 which is maximum
Input:
8
3 2 3 2 3 5 1 3
Output:
17
Explanation:
Shivang will eat on 1st, 3rd, 5th , 6th and 8th
day which totals (3+3+3+5+3) = 17
Solution Approach:
解決方法:
Let say,
說,
f(n) = maximum calorie can be taken till nth day under the constraint
No, let's think of the case,
不,讓我們考慮一下情況,
If Shivang takes food on ith day, he need to skip on (i-1)th day and sum with f(i-2)
如果Shivang在第 i 個一天需要吃的,他需要跳過(I-1) 個天,和與F(I-2)
Tale food on ith day, (i-1)th day and skip on (i-2)th day, sum up with f(i-3)
i上故事食品個天, 第(i-1) 個天,并跳過對第(i-2) 個天,總結和f(I-3)
Skip ith day, so take f(i-1)
跳過第 i 個天,所以采取F(I-1)
So,
所以,
f(i)=maximum(f(i-1),f(i-2)+arr[i],arr[i]+arr[i-1]+f(i-3) i>=3
For base case,
f(0)=arr[0]
f(1)=arr[0]+arr[1]
f(2)=maximum(arr[0]+arr[1],arr[1]+arr[2],arr[2]+arr[0])
Converting to Dynamic programming
轉換為動態編程
Now, we need to convert the above recursion into dynamic programming to avoid the overlapping sub-problem re-computation
現在,我們需要將上述遞歸轉換為動態編程,以避免重疊的子問題重新計算
1) Declare int DP[n];
2) Fill with the base case
DP[0]=arr[0];
DP[1]=arr[0]+arr[1];
DP[2]=std::max(arr[1]+arr[2],std::max(arr[0]+arr[2],DP[1]));
3) Compute the other values
for i=3 to n-1
DP[i]=maximum(arr[i]+arr[i-1]+DP[i-3],arr[i]+DP[i-2],DP[i-1]);
end for
4) Return the result, DP[n-1];
C++ Implementation:
C ++實現:
#include <bits/stdc++.h>
using namespace std;
int maximumCalorie(vector<int> arr, int n)
{
int DP[n];
// base case
DP[0] = arr[0];
DP[1] = arr[0] + arr[1];
DP[2] = std::max(arr[1] + arr[2], std::max(arr[0] + arr[2], DP[1]));
for (int i = 3; i < n; i++) {
DP[i] = std::max(arr[i] + arr[i - 1] + DP[i - 3], std::max(arr[i] + DP[i - 2], DP[i - 1]));
}
return DP[n - 1];
}
int main()
{
int t, n, item;
cout << "Enter number of days\n";
cin >> n;
cout << "Enter calories\n";
vector<int> a;
for (int j = 0; j < n; j++) {
scanf("%d", &item);
a.push_back(item);
}
cout << "Maximum calorie sudhir can take: " << maximumCalorie(a, n) << endl;
return 0;
}
Output:
輸出:
Enter number of days:
8
Enter calories:
3 2 3 2 3 5 1 3
Maximum calorie sudhir can take: 17
翻譯自: https://www.includehelp.com/icp/maximum-calorie.aspx
/ 卡路里