Rain and Umbrellas(dp)
生活随笔
收集整理的這篇文章主要介紹了
Rain and Umbrellas(dp)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接 http://codeforces.com/problemset/problem/988/F
令dp[i][j]為走到目標(biāo)為i處,手里拿著第j把傘,同時(shí)注意,在某處可能存在不止一把傘
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) typedef long long ll; int dp[2006][2006],a,n,m; int rain[2006],umbre[2006]; int val[2006],pos[2006]; int main() {scanf("%d%d%d",&a,&n,&m);memset(rain,0,sizeof(rain));memset(umbre,0,sizeof(umbre));a++;for(int i=0,x,y;i<n;i++){scanf("%d%d",&x,&y);for(int j=x+1;j<=y;j++)rain[j]=1;}for(int i=1,x,y;i<=m;i++){scanf("%d%d",&x,&y);x++;pos[i]=x;val[i]=y;if(!umbre[x] || (umbre[x] && y<val[umbre[x]]))umbre[x]=i;}memset(dp,INF,sizeof(dp));dp[0][0]=0;for(int i=0;i<a;i++){for(int j=0;j<=m;j++){if(pos[j]>i) continue;if(j) dp[i+1][j]=min(dp[i+1][j],dp[i][j]+val[j]);if(!rain[i]) dp[i+1][0]=min(dp[i+1][0],dp[i][j]);if(umbre[i]) dp[i+1][umbre[i]]=min(dp[i+1][umbre[i]],dp[i][j]+val[umbre[i]]);//同一個(gè)點(diǎn)可能存在多個(gè)雨傘 }}int ans=INF;for(int i=0;i<=m;i++)ans=min(ans,dp[a][i]);printf("%d\n",ans>=INF?-1:ans);return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/9151923.html
總結(jié)
以上是生活随笔為你收集整理的Rain and Umbrellas(dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python与java的猜拳游戏
- 下一篇: 带时分秒的日历控件