日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

csu1646 HearthStone

發布時間:2023/12/29 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 csu1646 HearthStone 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


好久沒有寫dp,這題算很基礎.
dp首先定義狀態:dp[i][j][k]:當進行到第i輪,達拉然法師出場j個,刺骨使用k次情況下的最大傷害。
仔細考慮,還有每輪的費用,法師,刺骨使用幾張的情況這些并不需要定義成狀態。開始我想復雜,把這些也定義成狀態,結果狀態轉移方程反而不好寫。這里就要思考一個變換過程中并不是要把每一個變換都設置為狀態的一個變量,只要拍你定義的狀態容易寫出狀態轉移方程,并能正確求解這個過程就是好的dp解法。
定義好了狀態:就是考慮每輪在費用一定的情況下,你可以選擇 只有添加法師和刺骨數量的不同。這樣狀態轉移方程就可以慢慢推。注意一個條件在某一輪內,若在使用刺骨之前使用過至少一張卡,則可額外造成2點傷害,分情況轉移一下!

#include<bits/stdc++.h> using namespace std; int dp[25][210][210];//定義dp[i][j][k] 定義當前i輪過后使用了j張法師,k個刺骨的最大傷害 int main() {int T;scanf("%d",&T);while(T--){int r,n,m;scanf("%d%d%d",&r,&n,&m);memset(dp,-1,sizeof(dp));dp[1][0][0]=0;for(int i=1;i<r;i++){for(int j=0;j<=n;j++){for(int k=0;k<=m;k++){if(dp[i][j][k]==-1) continue;int f=(i+1)<10 ? (i+1): 10;for(int d=0;d<=f/3;d++){if(j+d<=n){for(int c=0;c<=f/2;c++){if(k+c<=m&&d*3+c*2<=f){if(d==0&&c!=0) dp[i+1][j][k+c]=max(dp[i+1][j][k+c],dp[i][j][k]+j+(j+d+4)*c-2);else dp[i+1][j+d][k+c]=max(dp[i+1][j+d][k+c],dp[i][j][k]+j+(j+d+4)*c);}}}}}}}int maxn=0;for(int i=0;i<=n;i++){for(int j=0;j<=m;j++){maxn=max(maxn,dp[r][i][j]);}}printf("%d\n",maxn);} }

總結

以上是生活随笔為你收集整理的csu1646 HearthStone的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。