題目:
小q和牛博士合唱一首歌曲,這首歌曲由n個音調組成,每個音調由乙個正整數表示。
對於每個音調要麼由小q演唱要麼由牛博士演唱,對於一系列音調演唱的難度等於所有相鄰音調製化幅度之和, 例如乙個音調序列是8, 8, 13, 12, 那麼它的難度等於|8 - 8| + |13 - 8| + |12 - 13| = 6(其中||表示絕對值)。
現在要對把這n個音調分配給小q或牛博士,讓他們演唱的難度之和最小,請你算算最小的難度和是多少。
如樣例所示: 小q選擇演唱難度為1, 牛博士選擇演唱難度為2,難度之和為3,這乙個是最小難度和的方案了。
輸入描述:
輸入包括兩行,第一行乙個正整數n(1 ≤ n ≤ 2000) 第二行n個整數v[i](1 ≤ v[i] ≤ 10^6), 表示每個音調。
輸出描述:
輸出乙個整數,表示小q和牛博士演唱最小的難度和是多少。
輸入例子1:
5 1 5 6 2 1
輸出例子1:
3程式:
c版本
#include
#include
typedef
long
long llong;
inline
void getmin(llong& n, llong x)
#define maxn 2020
int n;
int v[maxn], cost[maxn];
void read()
}llong dp[maxn][maxn];
void work()
for (int i = 2; i < n; ++i)
}for (int i = 0; i < n - 1; ++i)
printf("%lld\n", res);
}int main()
c++版本(此版本只能ac70%,未找到原因)
#include
#include
#include
using
namespace
std;
int main()
for (int i = 2; i < n; i++)
dp[i][i - 1] = min;
}long res =1000000;
for (int i = 0; i < n-1; i++)
if (dp[n - 1][i] < res)
res = dp[n - 1][i];
cout
0;}
點評:
此題採用動態規劃
容易想到乙個人繼續演唱或換人演唱的時候發生狀態轉移:
可先設 dp[i][j] 表示當前小q唱到第 i 個音調,牛博士唱到第 j 個音調的難度和;
不妨設當前 i > j :
若 i - 1 == j 則發生換人,由於不知道上一次 i 唱到**,狀態由 min, k < j 轉移來;
若 i - 1 > j 則表示當前是從 i - 1 唱到 i 的,沒有換人,狀態由 dp[i-1][j] + abs(v[i] - v[i-1]) 累加;
不妨設 dp[i][j] 表示當前演唱到第 i 個,上乙個人演唱到第 j 個,則狀態轉移方程為
dp[i][j] = dp[i-1][j] + abs(v[i] - v[i-1]), j < i - 1
dp[i][i -1] = min, k < i - 1
初始情況是若當前有 i 個音調,可以讓乙個人只唱第乙個或最後乙個音調,剩下的音調都由另乙個人唱:
dp[i][0] = dp[i-1][0] + abs(v[i] - v[i-1]), i ≥ 2
dp[i][i-1] = dp[i-1][i-2] + abs(v[i-1] - v[i-2]), i ≥ 2
網易2018秋招筆試題之合唱
小q和牛博士合唱一首歌曲,這首歌曲由n個音調組成,每個音調由乙個正整數表示。對於每個音調要麼由小q演唱要麼由牛博士演唱,對於一系列音調演唱的難度等於所有相鄰音調製化幅度之和,例如乙個音調序列是8,8,13,12,那麼它的難度等於 8 8 13 8 12 13 6 其中 表示絕對值 現在要對把這n個音...
2018網易校招題
1 為了得到乙個數的 相反數 我們將這個數的數字順序顛倒然後再加上原先的數得到 相反數 例如,為了得到1324的 相反數 首先我們將該數的數字順序顛倒。我們得到5231,之後再加上原先的數,我們得到5231 1325 6556,如果顛倒之後的數字有字首 字首零將會被忽略。例如n 100。顛倒之後是1...
2018網易秋招內推筆試題 彩色的磚塊
題目 小易有一些彩色的磚塊。每種顏色由乙個大寫字母表示。各個顏色磚塊看起來都完全一樣。現在有乙個給定的字串s,s中每個字元代表小易的某個磚塊的顏色。小易想把他所有的磚塊排成一行。如果最多存在一對不同顏色的相鄰磚塊,那麼這行磚塊就很漂亮的。請你幫助小易計算有多少種方式將他所有磚塊排成漂亮的一行。如果兩...