目录
题目
现在有一个长度为n的价格数组a,表示某只股票每天的价格,你每天做多买入或卖出该只股票的1手股票,买入或者卖出没有手续费,且卖出股票前必须手里已经有股票才能卖出,但是持有的股票数目不受限制,并且初始资金为m元。你再任意时刻都不能进行透支,所以你的资金必须始终大于等于0,请问你在n天结束之后,拥有的最大总资产是多少?(总资产:股票数目*股票价格+现金)
输入
第一行两个整数n,m(1<=n<=2000,1<=m)
第二行n个正整数a(n)(1<=a[n]),其中a(i)表示股票在第i天的售价
输出
输出n天结束后,拥有的最大总资产
示例
输入
n = 6 , m = 2
a[n] = [ 2 3 1 1 1 2 ]
输出
max = 6
输入
n = 3, m = 2
a[n] = [ 1 1 4 ]
输出
max = 8
思路
代码
public class TestDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//输入n为天数
int n = sc.nextInt();
//输入m为初始资金
int m = sc.nextInt();
//输入数组a为每一天的股票价格
int[] a = new int[n];
for(int i=0;i<n;++i){
a[i]=sc.nextInt();
}
//定义状态数组
int[][] ret = new int[n][n+1];
//设置初始状态
if(m>=a[0])
ret[0][1] = m-a[0]+a[n-1];
else
ret[0][1] = -1;
ret[0][0] = m;
//状态转移
for(int i =1;i<n;i++){
//因为股票数不可能大于天数,所以j<=i+1,并且不能大于总股票数,所以j<n
for(int j = 0;j<=i+1 && j<n;j++){
//能不能卖
int a1;
if(ret[i-1][j+1]!=-1)
a1 = a[i]-a[n-1] +ret[i-1][j+1];
else
a1 = -1;
//能不能买
int b1;
if(j>0 && ret[i-1][j-1]-(j-1)*a[n-1] >= a[i])
b1 = a[n-1]-a[i] +ret[i-1][j-1];
else
b1 = -1;
//不买不卖
int c1 = ret[i-1][j];
ret[i][j] = Math.max(a1,Math.max(b1,c1));
}
}
//返回结果
int max = 0;
for(int j=0;j<n;++j){
max=Math.max(ret[n-1][j],max);
}
System.out.println(max);
}
}