JSK 107305丨ICPC焦作站網賽 B丨dp

2021-08-28 03:45:59 字數 1120 閱讀 8177

題意:

給出n個數字,順次取出m個數,按照給出的m個運算子,依次去運算於k。保證m個運算子都用掉,求算計算結果的最大值。

思路:

觀察到m很小只有5,5x1000的複雜度是夠用的,所以可以找找狀態轉移方程,推導關係。

我們記dp[i][j]取到第i個數,用掉第j個運算子的最大值。

容易想到兩種結果,

一種是:dp[i][j]= dp[i-1][j-1]~運算子[j]~a[i];也就是取當前ai的情況;

另一種是:dp[i][j]= dp[i][j-1]; 也就是不取ai,轉移上一次用掉j個運算子的情況;

一開始我以為就這兩種夠了,wa了三發。

分享乙個易錯樣例:

1 5 3 6

-5 3 -4 -1 2

*+/

這個例子裡,我們需要((6*-5)+-4)/-1得到最大答案,但可以發現,這個最大值是從中間最小值轉移過來的(最小值/-1的情況),那麼我就記了乙個pd,用類似的方法求最小值,然後把最小值得到的最大值轉移到dp的情況也算上,結果就完整了。

果然還是不能想得太簡單,具體看**。

初始化有些小細節還要多斟酌一下。

#include 

#include

#include

using

namespace

std;

typedef

long

long ll;

const ll mod=1e9+7;

ll calc(ll x,char op,ll y)

}int t,n,m;

ll k;

ll a[1005],dp[1005][6],pd[1005][6];

char f[15];

int main()

printf("%lld\n",dp[n][m]);

}return0;}

/*55 5 6

-1 -1 -1 -1 -1

-----

2 1 5

2 3/

3 2 1

1 2 3

++4 4 5

1 2 3 4

+-*/

JSK 18 跳躍遊戲 基礎

跳躍遊戲 給定乙個非負整數陣列,假定你的初始位置為陣列第乙個下標。陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。請確認你是否能夠跳躍到陣列的最後乙個下標。例如 a 2,3,1,1,4 能夠跳躍到最後乙個下標,輸出true a 3,2,1,0,4 不能跳躍到最後乙個下標,輸出false。第一行輸...

JSK 7 奇怪的國家 入門

奇怪的國家 有乙個奇怪的國家,裡面的國民對於事情的態度永遠只有兩面。當兩個人遇到一起討論乙個事情的時候 兩個持贊同觀點的人遇到一起後會對這個事情都繼續贊同 乙個持贊同觀點的人遇到乙個持不贊同觀點的人的時候,兩人都會不再繼續贊同 兩個持不贊同觀點 的人遇到一起討論後反而會對這個事情開始贊同。輸入包括兩...

JSK 16 爬樓梯 基礎

爬樓梯 假設你現在正在爬樓梯,樓梯有 n 級。每次你只能爬 1 級或者 2 級,那麼你有多少種方法爬到樓梯的頂部?第一行輸入乙個整數 n 1 n 50 代表樓梯的級數。輸出爬到樓梯頂部的方法總數。樣例輸入 5樣例輸出 8 問題描述 略 問題分析 站在樓梯的第n級想一下,前一步是從 來的,問題就清楚了...