• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

C.连锁店

每次测试的时间限制

1秒钟

每次测试的内存限制

512兆字节

投入

标准输入

输出

标准输出

比特山是一个旅游胜地。它总共有N个景点,按照海拔从1到N的顺序编号。为了更好地帮助游客欣赏这里的风景,人们在上面修建了M条缆车路线。

每条缆车路线只能将游客从一个海拔较低的景点运送到另一个海拔较高的景点。

每个景区都有一个纪念品连锁店,其中第I个景区的店属于公司ci,两个连锁店(I,j)属于同一公司当且仅当ci=cj。每家公司都有新客户优惠活动,第I家公司给新客户的优惠红包是wi元。

一旦收到公司下属连锁店的红包,就不能收到公司所有分店的红包。

你在一号景区,你会坐缆车去各个景点。在各景点可领取该景点(含一号景点)连锁店的新客折扣红包。当然,同一家公司的红包最多只能领一次。

请写一个程序,找出一条从一号景点到二号景点的旅游路线。K景区为每个可能的目的地K,让你可以收到最多金额的折扣红包。

例子

投入

5 5

1 2 2 3 4

1 4 5 9 3

1 2

2 3

3 5

1 4

4 5

输出

一个

15

这个问题的关键是成员资格。当我们选择同一套中的任意一个,其他的红包就收不到了。

所以根据这个关系,我们可以把这个问题看成是在不同状态下选择某个红包,在每个状态下不断更新当前状态下可以获得的红包的最大值。

建立压力dp,dp[j]表示在站I的状态J下可以获得的最大红包值

虽然建立的dp也能跑,但是2.36倍有点大,容易TLE,可以优化一下原来的关系。

因为在选线的时候,假设我们可以选择1-2-3-4和1-4,那么我们就必须选择1-2-3-4。这种情况下,我们拿到红包的机会可能最大。

因此,这在构建地图时得到了优化。

1 #包括牡蛎

2 #包含算法

3 # include字符串

4 # includevector

5 # includemap

6 #定义整型长整型

7 #定义endl '\n '

8使用命名空间std

9 const int N=2e5 10

10 int a[N],b[N];

11 int ne[N];

12向量p[60],go[60],ZT[60];

13 mapint,int DP[60];

14 int g[60][60];/*第一次保存图片*/

15 int ans[60];

16 void solve() {

17 int n,m;

18 cin新媒体;

19 for(int I=1;I=n;i) {

20 CIN a

21 p[a]。push_back(一);/*

22存储从属关系

23 */

24 }

25 for(int I=1;I=n;i) {

26 CIN b;/*每个点的红包值*/

27 }

28 for(int I=1;I=m;i) {

29 int x,y;

30 CIN x y;

31g[x][y]=1;/*构建地图*/

32 }

33 for(int I=1;I=n;我)

34 for(int j=I 1;j=n;j)

35 for(int k=I 1;k=j;k)

36 if(g[j]==1g[k]==1g[k][j]==1)

37g[j]=0;/*优化地图构建*/

38

39 for(int I=1;I=n;我)

40 for(int j=I 1;j=n;j)

41 if (g[j]) go[j]。push_back(一);/*记录每个点的前一个点*/

42 DP[1][(int)1a[1]]=b[a[1]];

43 ans[1]=b[a[1]];

44 zt[1]。push _ back((int)1a[1]);

45

46 for(int I=2;I=n;i) {

47 int bit=a

4for (intres3360go )/*枚举当前节点可以从前一个节点的哪个状态转移*/

4for (int S:ZT [RES]) {/*枚举上一个节点的所有状态*/

5if (s (int) 1bit) {/*如果前一个节点已经通过*/

51如果(!Dp。count(s)) {/*当前节点是否存储过当前状态*/

52 DP=DP[RES]

53 zt。推回;/*保存此状态而不存储*/

54 }

55 dp=max(dp,DP[RES]);/*迭代*/

56 ans=max(ans,DP);/*更新到达当前节点的最大红包值*/

57 }

58其他{/*若没经过上一个点*/

59 int now=s |(int)1 bit;/*现在的状态*/

60如果(!dp.计数(现在)){

61 zt.推回(现在);

62 }

63 dp[now]=max(dp[now],DP[RES]b[a]);/*如果没经过上一个点那么当前节点就会多一个红包*/

64 ans=max(ans,DP[now]);

65 }

66 }

67 }

68 for(int I=1;I=n;coutansendl;

69

70 }

71国际TT;

72带符号的main() {

73 IOs : sync _ with _ stdio(false);

74号。tie(nullptr);

75 cout。tie(nullptr);

76 TT=1;

77 while (tt - ) {

78 solve();

79 }

80

81

82返回0;

83 }

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now