题目背景
重要的不是去哪里,而是和你在一起。——小红
对小明和小红来说,20142014 年 77 月 2929 日是一个美好的日子。这一天是他们相识 100100 天的纪念日。
(小明:小红,感谢你 22 场大考时默默的支持,100100 个日夜的陪伴;感谢你照亮我 100100 个美好的日子,给我留下无数美好的回忆……在这个美好的日子里,我准备带你去旅行。)
题目描述
小明和小红还剩下 nn 天的假期,小明可以安排旅行的计划。如果连续 xx 天旅游,小明需要花旅行费用 p imes x imes xp×x×x 元;如果连续 xx 天不旅游,小明需要请小红吃饭,花费为 q imes xq×x 元( p,qp,q 都是输入的常数)。
请你帮小明写一个程序,计算出假期里他至少需要花费多少元。
输入格式
输入只有一行,包含三个空格隔开的正整数 n,p,qn,p,q。
输出格式
一行,一个正整数表示小明至少需要花费多少元。
输入输出样例
输入 #1
6 1 7
输出 #1
20
说明/提示
数据规模与约定
- 对于 20\%20% 数据,1 le n le 201≤n≤20。
- 对于 90\%90% 数据,1 le n le 10^31≤n≤103,1 le p le 2 imes 10^31≤p≤2×103,1 le q le 10^41≤q≤104。
- 对于 100\%100% 数据,1 le n le 2 imes 10^51≤n≤2×105,1 le q le p le 10^41≤q≤p≤104。
题解:写(chao)了个90分代码,复习dpdpdp!!!争取拿到部分分!我现在冲着部分分来的。正解斜率优化与我无瓜
#include<cstdio> #include<iostream> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<bits/stdc++.h> typedef long long ll; using namespace std; const int N=200004; ll n,p,q,dp[2][N]; int main(){ //freopen("2134.in","r",stdin); //freopen("2134.out","w",stdout); scanf("%d %d %d",&n,&p,&q); for(int i=1;i<=n;i++) dp[0][i]=dp[1][i]=0x3f3f3f3f; for(int i=1;i<=n;i++){ for(int j=0;j<i;j++){ dp[0][i]=min(dp[0][i],dp[1][j]+p*(i-j)*(i-j)); dp[1][i]=min(dp[1][i],dp[0][j]+q*(i-j)); } } cout<<min(dp[0][n],dp[1][n]); return 0; }