題目鏈結
有 \(n\) 只球隊, \(m\) 場比賽,有實力值 \(a_i\) 和帥哥數 \(b_i\) 。 \(m\) 場比賽的輸入格式為 \(p_i\)
\(q_i\) 。有一男一女,男生認為精彩度為兩比賽的實力乘積,女生認為是帥哥數之和。在女生認為的精彩度不少於 \(c\) 時,男生認為的精彩度最大為多少,且兩人最多能看 \(k\) 場比賽。
很簡單,二維費用 \(dp\) 。
設 \(dp[i][j][k]\) :列舉到第 \(i\) 場比賽,共看了 \(j\) 場比賽,女生認為精彩度為 \(k\) 時,男生認為的精彩度的最大值。
顯然,目標在 \(dp[m][k][c]\) 至 \(dp[m][k][sum]\) 之間,其中 \(sum\) 為女生最大精彩度。
也不難推出狀態轉移方程:
\(dp[i][j][k] = max(dp[i - 1][j][k], dp[i - 1][j - 1][k - b[p[i]] - b[q[i]]] + a[p[i]] * a[q[i]])\)
初始值為 \(dp[i][0][0]=0(0≤i≤m)\) ,其餘都為負無窮。
#include #include #include using namespace std;
void quick_read(int &n)
while(c >= '0' && c <= '9')
n *= op;
}const int maxn = 1e2 + 5;
const int maxm = 2e3 + 5;
int dp[maxn][maxn][maxm];
int a[maxn], b[maxn], p[maxn], q[maxn];
int n, m, k, c;
int sum;
void read()
}void dp()
} }int ans = -1;
for(int i = c; i <= sum; i++)
ans = max(ans, dp[m][k][i]);
printf("%d", ans);
}int main()
看球泡妹子
顯然的二維費用揹包。把小紅的當做體積,把能看的場數當做質量,小明的當做價值做揹包。因為我們要得到剛好體積為某個值,場數為某個值的價值,所以提前全面賦值為 inf。ac pragma gcc optimize ofast funroll all loops include define int lon...
P2416 泡芙 題解
當火星貓走過一條路之後,這條路就不能再走了 從這句話我們可以想出來,如果走過的這條路是橋,那麼火星貓就會再也無法走回去。那麼我們可以先求一遍邊雙並縮點。如果您不會求邊雙,您可以看這個雲剪貼簿。求邊雙的同時我們可以標記該邊雙內是否有有泡芙的邊。求出邊雙縮點後再建圖,由邊雙連通分量縮點的性質我們知道縮出...
牛客題霸 牛妹的蛋糕 C 題解 答案
眾所周知,牛妹非常喜歡吃蛋糕。第一天牛妹吃掉蛋糕總數三分之一 向下取整 多乙個,第二天又將剩下的蛋糕吃掉三分之一 向下取整 多乙個,以後每天吃掉前一天剩下的三分之一 向下取整 多乙個,到第n天準備吃的時候只剩下乙個蛋糕。牛妹想知道第一天開始吃的時候蛋糕一共有多少呢?題目問的是第一天吃的什麼,給的是吃...