2013長沙邀請賽Travel in time

2021-06-22 18:46:00 字數 1259 閱讀 5459

題意:給乙個無向圖和時間限制,景點到景點需要時間,每遊覽乙個景點會得到相應價值也會花費相應時間,而且你下乙個遊覽的景點的價值必須比現在的大。求從起始景點到結束景點獲得的最大價值。你可以路過任意乙個景點而不遊覽,這樣也不花費時間。

首先,肯定要求出景點間的最短距離,因為任意景點都可以只路過,所以增加乙個虛擬起點,這裡景點編號0~n-1,所以虛擬起點定為n。初始化:cost【n】【be】=cost【be】【n】=0(be為起始景點),然後floyd、spfa什麼的求最短路徑。

其次,最大價值需要dp求解:

前提條件:

val[i]>

val[t]&&sum+cost[t][i]+need[i]+cost[i][en]<=lim

關係方程:dp[

sum][t]=

max(dp[

sum][t],

deal

(sum

+cost[t

][i]+need[i

],i)+val[i

]);

其中sum為當前花費時間,t為此時遊覽的景點,lim為時間限制,val陣列為景點價值,cost陣列為最短路徑花費時間,need陣列為遊覽這個景點花費時間。(i從0~n-1)#include#includeusing namespace std;

int n,lim,en;

int need[305],val[305];

int cost[305][305],dp[305][305];

int deal(int sum,int t)

int main()

for(k=0; k<=n; k++)

for(i=0; i<=n; i++)

for(j=0; j<=n; j++)

if(cost[i][j]>cost[i][k]+cost[k][j])cost[i][j]=cost[i][k]+cost[k][j];

printf("case #%d:\n",t);

if(cost[n][en]>lim)printf("0\n");

else printf("%d\n",deal(0,n));

}return 0;}/*

34 4 22 0 3

1 1 1 1

5 7 9 12

0 1 10

1 3 10

0 2 10

2 3 10

21*/

2023年acm長沙邀請賽 HDU4565

這個部落格講的比較好 題意 給定a,b,n,m,求sn void init 初始化操作 matrix multi matrix a,matrix b 矩陣乘法操作 c.m i j m return c matrix power ll k 矩陣求冪操作,二分的思想 return ans int mai...

2013 ACM ICPC 杭州邀請賽 8 5

a。dp 但是m次數太多,開不出那麼大的陣列,所以要用算完的值替代新的值,這樣來回迴圈,滾動陣列,我用的方法比較麻煩,看到有 2的,也有 1的 我寫的是每一次從0到n迴圈一邊,能到的話概率相加 還有一種思路是當前的概率至與上一次的概率有關,每一次都是dp i j dp i 1 j x n n dp ...

湘潭邀請賽A

哥德 猜想 任一大於2的偶數,都可表示成兩個素數之和。是世界上最著名的未解問題之一,但是下面的反哥德 猜想 任一大於11的奇數,都可表示成兩個合數之和。確很容易證明。定義反哥德 分拆數g n 表示將大於11的奇數n分解為兩個合數之和的方案數。再定義sg n sum 即所有不大於n的奇數的反哥德 分拆...