洛谷P2029跳舞
2024-10-01 10:13:24
题目
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;
}
最新文章
- JAVA的容器---List,Map,Set (转)
- Oracle 游标使用
- 制做RPM包
- git(4)如何在windows上安装git
- Linux msgsnd : invalid argument
- oracle中的dual表详解
- 全局函数的Result一定要每次都初始化,否则上次的结果会被保持到下一次继续使用
- 【.Net基础拾遗】品味OO继承
- PHP之输出控制 ob_start(),ob_get_contents(),ob_end_clean()
- DataFrame创建
- Flink升级到1.4版本遇到的坑
- UsernamePasswordAuthenticationToken
- 【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆
- 表单验证,添加动态class
- ArcMap 图层无法编辑
- smali注入常用代码
- Confluence 6 为 Active Directory 配置一个 SSL 连接
- Java中读取.properties配置文件的通用类
- 转:使用Mosquitto-Auth-Plugin对mqtt客户端进行验证
- 20155304 2016-2017-2 《Java程序设计》实验五(网络编程与安全)实验报告