洛谷P2029跳舞
题目
DP, 用的dp[i][j]表示i之前的数选了j个得到的最大结果,然后状态转移方程应该是
if(j%t==0) dp[i][j]=max(dp[i][j],max(dp[i−1][j]−S[i],dp[i−1][j−1]+S[i]+B[i]));
else dp[i][j]=max(dp[i][j],max(dp[i−1][j]−S[i],dp[i−1][j−1]+S[i]));
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, t, maxn;
int S[1001010], B[100010];
int sums[1001001], sumb[101001];
int dp[5001][5001];//dp[i][j]表示前i个数已经连续跳了j次的最大得分, j属于1到t
int main()
{
scanf("%d%d", &n, &t);
for (int i = 1; i <= n; i++)
scanf("%d", &S[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &B[i]);
for (int i = 1; i <= n; i++)
dp[i][0] = dp[i - 1][0] - S[i];//初始化为负的前缀和,因为不选会扣分。
for (int i = 1; i <= n; i++)
for (int j = i; j >= 1; j--)
{
if (j % t == 0)//
dp[i][j] = max(dp[i][j], max(dp[i - 1][j] - S[i], dp[i - 1][j - 1] + S[i] + B[i]) ); // [i-1][j]说明i这个位置的数不选。
else
dp[i][j] = max(dp[i][j], max(dp[i - 1][j] - S[i], dp[i - 1][j - 1] + S[i]) );
}
for (int i = 1; i <= n; i++)
maxn = max(maxn, dp[n][i]);
printf("%d", maxn);
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步