題意:
給出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級想一下,前一步是從 來的,問題就清楚了...