题解 | #money#c++/python3/java (1)dp
money
https://ac.nowcoder.com/acm/contest/20323/D
链接:https://ac.nowcoder.com/acm/contest/20323/D
来源:牛客网
题目描述
白云已经建立了n家店铺,数量从1到n不等。
白兔想按从1到n的顺序参观这些商店。
编号为i的商店有一个价格a[i],表示大白兔在第i家商店可以花费a[i]美元购买产品或销售产品以获得a[i]美元。
产品太重,大白兔一次只能吃一种产品。
在参观了所有的商店之后,白兔想知道最大利润。
另外,白兔想知道在获得最大利润的同时,交易的最少数量。
请注意,白兔最初拥有无限的金钱。
输入描述:
第一行包含一个整数T(0<T<=5),表示测试用例的数量。
在每个测试用例中,第一行中有一个整数n(0<n<=100000),表示存储的数量。
对于下一行,范围[02147483648]中有n个整数,表示[1..n]。
输出描述:
对于每个测试用例,打印一行包含2个整数,表示最大利润和最小交易数。
思路和心得
(一)dp
1.和力扣上,股票的最大收益是一样的
python3代码
T = int(input())
for _ in range(T):
n = int(input())
nums = [int(x) for x in input().split()]
dp = [[0, 0] for _ in range(n)]
dp[0][0] = 0
dp[0][1] = -nums[0]
step = [[0, 0] for _ in range(n)]
step[0][1] = 1
for i in range(1, n):
if dp[i - 1][1] + nums[i] > dp[i - 1][0]:
dp[i][0] = dp[i - 1][1] + nums[i]
step[i][0] = step[i - 1][1] + 1
else:
dp[i][0] = dp[i - 1][0]
step[i][0] = step[i - 1][0]
if dp[i - 1][0] - nums[i] > dp[i - 1][1]:
dp[i][1] = dp[i - 1][0] - nums[i]
step[i][1] = step[i - 1][0] + 1
else:
dp[i][1] = dp[i - 1][1]
step[i][1] = step[i - 1][1]
print("{} {}".format(dp[n - 1][0], step[n - 1][0]))
c++代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <assert.h>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T; cin >> T;
for (int _ = 0; _ < T; _ ++)
{
int n; cin >> n;
int nums[n];
for (int i = 0; i < n; i ++){
cin >> nums[i];
}
long long dp[n][2];
memset(dp, 0, sizeof(dp));
dp[0][0] = 0LL;
dp[0][1] = -nums[0];
int step[n][2];
memset(step, 0, sizeof(step));
step[0][0] = 0;
step[0][1] = 1;
for (int i = 1; i < n; i ++)
{
if (dp[i - 1][1] + nums[i] > dp[i - 1][0])
{
dp[i][0] = dp[i - 1][1] + nums[i];
step[i][0] = step[i - 1][1] + 1;
}
else
{
dp[i][0] = dp[i - 1][0];
step[i][0] = step[i - 1][0];
}
if (dp[i - 1][0] - nums[i] > dp[i - 1][1])
{
dp[i][1] = dp[i - 1][0] - nums[i];
step[i][1] = step[i - 1][0] + 1;
}
else
{
dp[i][1] = dp[i - 1][1];
step[i][1] = step[i - 1][1];
}
}
cout << dp[n - 1][0] << ' ' << step[n - 1][0] << endl;
}
return 0;
}
java代码
import java.util.*;
import java.io.*;
public class Main
{
public static void main(String [] args) throws Exception
{
BufferedReader BR = new BufferedReader(new InputStreamReader(System.in));
String [] line1 = BR.readLine().split(" ");
int T = Integer.parseInt(line1[0]);
for (int ee = 0; ee < T; ee ++)
{
String [] line2 = BR.readLine().split(" ");
int n = Integer.parseInt(line2[0]);
int [] nums = new int [n];
String [] line3 = BR.readLine().split(" ");
for (int i = 0; i < n; i ++){
nums[i] = Integer.parseInt(line3[i]);
}
long [][] dp = new long [n][2];
dp[0][0] = 0L;
dp[0][1] = -nums[0];
int [][] step = new int [n][2];
step[0][0] = 0;
step[0][1] = 1;
for (int i = 1; i < n; i ++)
{
if (dp[i - 1][1] + nums[i] > dp[i - 1][0])
{
dp[i][0] = dp[i - 1][1] + nums[i];
step[i][0] = step[i - 1][1] + 1;
}
else
{
dp[i][0] = dp[i - 1][0];
step[i][0] = step[i - 1][0];
}
if (dp[i - 1][0] - nums[i] > dp[i - 1][1])
{
dp[i][1] = dp[i - 1][0] - nums[i];
step[i][1] = step[i - 1][0] + 1;
}
else
{
dp[i][1] = dp[i - 1][1];
step[i][1] = step[i - 1][1];
}
}
System.out.println(dp[n - 1][0] + " " + step[n - 1][0]);
}
}
}