Jzoj P5907 轻功___动态规划

题目大意:

给出一个长为 N N N的序列,起点在 0 0 0,有 K K K种方式,每种可以花费 w i w_i wi然后从某个位置 i i i走到位置 i + C i i+C_i i+Ci,如果走到 i i i用的是 j j j方式,那么当你下一次走的时候方式不是 j j j时,切换方式需要花费 W W W,有 Q Q Q个限制 a i , b i a_i,b_i ai,bi,表示不能使用方式 a i a_i ai经过位置 b i b_i bi,问走到位置 N N N的最少花费。

N &lt; = 500 , K &lt; = 100 N&lt;=500,K&lt;=100 N<=500K<=100
Q &lt; = 50000 , W &lt; = 1 e 7 Q&lt;=50000,W&lt;=1e7 Q<=50000W<=1e7

分析:

f [ i ] [ j ] f[i][j] f[i][j]表示走到位置 i i i时方式为 j j j的最少花费,
f [ i ] [ j ] = m i n ( f [ i − C k ] [ k ] + w i + ( ( k = j ) ? 0 : W ) ) f[i][j]=min(f[i-C_k][k]+w_i+((k=j)? 0:W)) f[i][j]=min(f[iCk][k]+wi+((k=j)?0:W))
时间复杂度: O ( N K 2 ) O(NK^2) O(NK2)

代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
#define inf 0x7fffffff
#define N 505
#define M 105

using namespace std;

typedef long long ll;

struct Node { int len; ll cost; }a[M];
int sum[M][N], n, m, Q;
ll f[N][N], W;

int read(int &x)
{
	int f = 1; x = 0; char s = getchar();
	while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
	while (s >= '0' && s <= '9') { x = x * 10 + (s - '0'); s = getchar(); }
	x = x * f;
}

void write(ll x)
{
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}

int main()
{
    freopen("qinggong.in", "r", stdin);
    freopen("qinggong.out", "w", stdout);
	read(n); read(m); ++n; scanf("%lld", &W);
    for (int i = 1; i <= m; i++) read(a[i].len), scanf("%lld", &a[i].cost);
    read(Q);
    while (Q--)
    {
           int x, y; read(x); read(y);
           sum[y][x + 1] = 1;
	}
	for (int i = 1; i <= m; i++) 
	     for (int j = 1; j <= n; j++) sum[i][j] = sum[i][j] + sum[i][j - 1];	
	for (int i = 2; i <= n; i++) 
	     for (int j = 1; j <= m; j++) f[i][j] = inf;
	     
	for (int i = 2; i <= n; i++)
		 for (int j = 1; j <= m; j++)
		      if (i > a[j].len)
	              if (sum[j][i] - sum[j][i - a[j].len - 1] == 0)
	              {
	          	      for (int k = 1; k <= m; k++)
				            if (k != j) f[i][j] = min(f[i][j], f[i - a[j].len][k] + W + a[j].cost);
					               else f[i][j] = min(f[i][j], f[i - a[j].len][k] + a[j].cost);	
				  }
		  
	ll ans = inf;
	for (int i = 1; i <= m; i++) ans = min(ans, f[n][i]);
	if (ans == inf) printf("-1\n");
	         else { write(ans); printf("\n"); }
	return 0;	
} 
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值