題意:給乙個無向圖和時間限制,景點到景點需要時間,每遊覽乙個景點會得到相應價值也會花費相應時間,而且你下乙個遊覽的景點的價值必須比現在的大。求從起始景點到結束景點獲得的最大價值。你可以路過任意乙個景點而不遊覽,這樣也不花費時間。
首先,肯定要求出景點間的最短距離,因為任意景點都可以只路過,所以增加乙個虛擬起點,這裡景點編號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的奇數的反哥德 分拆...