标签:
Description
Input
Output
Sample Input
| input | output |
|---|---|
3 4 1 3 10 Licensed 1 2 2 Pirated 2 3 3 Licensed 2 3 6 Cracked |
Online 8 |
3 1 1 2 10 Licensed |
Offline |
大意:系统要从1更新到n,下面m行是可以进行更新的情况,x表示起点,y表示终点,d表示更新所要用的字节数目,问所需要消耗的最少字节数是多少。
先要对x进行排序,字符串处理未必需要strcmp,直接用ch[0]就可以了。
正品用正品更新完是正品,用盗版更新完是盗版,用破解版更新还是正品
盗版用盗版更新是盗版,用正品更新还是盗版,用破解版依旧是盗版
开个二维dp 1表示正品,2表示盗版
状态转移方程 dp[a[i].y] = min(dp[a[i].y],dp[a[i].x]+a[i].s)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct edge{
int x,y,s;
char ch[10];
}a[50010];
long long dp[50010][2];
bool cmp(edge i,edge j){
if(i.x == j.x) return i.y < j.y;
return i.x < j.x;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i = 1; i <= m ; i++)
scanf("%d%d%d%s",&a[i].x,&a[i].y,&a[i].s,&a[i].ch);
sort(a+1,a+m+1,cmp);
memset(dp,-1,sizeof(dp));
dp[1][1] = 0;
for(int i = 1;i <= m ;i++){
if(a[i].ch[0] == ‘L‘){
if(dp[a[i].x][1] != -1 &&(dp[a[i].y][1] == -1 || dp[a[i].y][1] > dp[a[i].x][1] + a[i].s))
dp[a[i].y][1] = dp[a[i].x][1] + a[i].s;
}
else if(a[i].ch[0] == ‘C‘){
if(dp[a[i].x][1] != -1 &&(dp[a[i].y][1] == -1 || dp[a[i].y][1] > dp[a[i].x][1] + a[i].s))
dp[a[i].y][1] = dp[a[i].x][1] +a[i].s;
if(dp[a[i].x][0] != -1 &&(dp[a[i].y][0] == -1 || dp[a[i].y][0] > dp[a[i].x][0] + a[i].s))
dp[a[i].y][0] = dp[a[i].x][0] + a[i].s;
}
else if(a[i].ch[0] == ‘P‘){
if(dp[a[i].x][0] != -1 && (dp[a[i].y][0] == -1 || dp[a[i].y][0] > dp[a[i].x][0] + a[i].s))
dp[a[i].y][0] = dp[a[i].x][0] + a[i].s;
if(dp[a[i].x][1] != -1 && (dp[a[i].y][0] == -1 || dp[a[i].y][0] > dp[a[i].x][1] + a[i].s))
dp[a[i].y][0] = dp[a[i].x][1] + a[i].s;
}
}
if(dp[n][0] == -1 && dp[n][1] == -1)
printf("Offline\n");
else {
printf("Online\n");
if(dp[n][0] == -1)
printf("%lld\n",dp[n][1]);
else if(dp[n][1] == -1)
printf("%lld\n",dp[n][0]);
else printf("%lld\n",min(dp[n][1],dp[n][0]));
}
}
return 0;
}
URAL1741——DP——Communication Fiend
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4496967.html