17AHU排位赛1 C题(经典DP)
problem
《snow halation》是μ’s的第二張單曲,其歌曲第二段伴奏結(jié)束后主唱穗乃果唱出“屆けて”的同時,全場應(yīng)援棒瞬間從白色轉(zhuǎn)換成橙色。由于高度的整齊和效果的震撼,被稱為“橙色的奇跡”,這也是“如果奇跡有顏色,那么一定是XX色”的最早來源。
現(xiàn)在,到了你來應(yīng)援的時候了!
使用不同的應(yīng)援形式有不同的效果(如里打、里跳、快揮、前揮、GT警報……),比如通常會GT警報后接著做里跳,這樣能夠讓人更加沉迷到演唱會的氣氛中。
經(jīng)過精密的計算,我們終于得到了不同的應(yīng)援形式連著對活躍氣氛的貢獻(xiàn)值(增加氣氛的活躍值)。
現(xiàn)在給你一首歌的call表(記錄應(yīng)該如何應(yīng)援),里面有一部分是0(代表這個動作可以自己隨意選擇),另一部分是非0整數(shù),表示這個時候有規(guī)定的動作要做。
求這首歌能達(dá)到的最大氣氛活躍值。
初始的氣氛活躍值為0,第一個應(yīng)援動作對氣氛無影響。
Input
第1行:組數(shù)T(非負(fù)整數(shù),1<=T<=10)
第2行:應(yīng)援動作數(shù)n,call表長度m(非負(fù)整數(shù),0<=n,m<=100)
第3~3+n行:每行n個整數(shù),表示在第i個動作后接j的氣氛貢獻(xiàn)值,Wi,j表示當(dāng)前行第j個。(|Wi,j|<=100)
第4+n行:m個非負(fù)整數(shù)a[i],表示call表內(nèi)容。(0<=a[i]<=n)
……
Output
一行,一個整數(shù),表示能達(dá)到的最大氣氛活躍值。
Sample Input
2
3 5
83 86 77
15 93 35
86 92 49
3 3 3 1 2
5 10
36 11 68 67 29
82 30 62 23 67
35 29 2 22 58
69 67 93 56 11
42 29 73 21 19
0 0 5 0 4 0 0 0 4 0
Sample Output
270
625
Hint
樣例解釋:
2
3 5
83 86 77
15 93 35
86 92 49
3 3 3 1 2
3 3 3 1 2
沒有可以自己隨便選的,直接計算得到49+49+86+86=270
5 10
36 11 68 67 29
82 30 62 23 67
35 29 2 22 58
69 67 93 56 11
42 29 73 21 19
0 0 5 0 4 0 0 0 4 0
4 3 5 1 4 1 4 1 4 5
按照這樣的順序來選
可以達(dá)到最大值 93+58+42+67+69+67+69+67+93
思路
最近剛接觸DP,昨天排位賽中沒有推出(大概想了20min沒有思路),今天看了ppt的提示,提示是這樣說的:
考慮dp[i][j]表示前i個位置,第i個位置選擇第j個姿勢的最大值
然后就開始寫程序,中間遞推式需要停下來想一下,最后完成了ac。
所以DP給我的感覺是怎么表示狀態(tài)很重要,一旦清楚什么參數(shù)表示什么自然而然遞推式就可以去試著推出來,再加上邊界那這題就OK了。
所以問題的關(guān)鍵在于:
構(gòu)造狀態(tài)
還是多多練習(xí)吧!
代碼示例
#include<bits/stdc++.h> using namespace std;const int maxn=105;const int inf=0x3f3f3f3f;int n,m;int arr[maxn];int call[maxn][maxn];//存call表 下標(biāo)1開始int dp[maxn][maxn]; //dp[i][j]表示第i個位置(i-1個氣氛值)選擇j動作的最大值int main() {ios::sync_with_stdio(false);int T;cin>>T;while(T--){memset(dp,-inf,sizeof(dp));cin>>n>>m;for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){cin>>call[i][j];}}for(int i=1;i<=m;++i){cin>>arr[i];}for(int i=1;i<=n;++i){dp[1][i]=0;}for(int i=2;i<=m;++i){if(arr[i-1]){if(arr[i]){dp[i][arr[i]]=dp[i-1][arr[i-1]]+call[arr[i-1]][arr[i]];//for(int j=1;j<=n;++j) if(j!=arr[i]) dp[i][j]-=100000;}else{for(int j=1;j<=n;++j){dp[i][j]=dp[i-1][arr[i-1]]+call[arr[i-1]][j];}}}else{if(arr[i]){for(int j=1;j<=n;++j){dp[i][arr[i]]=max(dp[i][arr[i]],dp[i-1][j]+call[j][arr[i]]);}}else{for(int j=1;j<=n;++j){for(int k=1;k<=n;++k){dp[i][k]=max(dp[i][k],dp[i-1][j]+call[j][k]);}}}}}int ans=-inf;for(int i=1;i<=n;++i){if(dp[m][i]>ans) ans=dp[m][i];}cout<<ans<<endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的17AHU排位赛1 C题(经典DP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2015年互联网女皇趋势报告中文版
- 下一篇: 基于MATLAB软件GUI界面的可编程电