【動態規劃】魔法石礦
時間限制: 1 sec 記憶體限制: 64 mb
提交: 116 解決: 27
[提交] [狀態] [命題人:admin]
題目描述
為了找到回家的路,張琪曼施展魔法,從高維空間召喚出了一種叫作「讀者」的生物,據說「讀者」這種生物無所不能,他們可以穿越時空的限制,聆聽到歷史的聲音、巨人的吶喊。但這次「讀者」卻很嚴肅地警告她們,從遠古起就陰魂不散的天頂星人已衝破封印再次降臨到了這個空間,她們若不早做準備,不僅她們所在的這個世界將變成修羅場,連「讀者」所在的時空也會受到牽連。最後「讀者」交給她們一張藏寶圖希望她們能收集足夠多的魔法石能量以對抗天頂星人的進攻。已知藏寶圖上標有若干個排成一條直線的魔法石礦,每個礦裡有一定數量的魔法石,如表所示。
同時每個礦中都有一張說明書,說明在挖完此礦的魔法石後還可繼續挖哪些礦,如圖所示。
挖礦規則為可以從任何乙個礦開始,到任何乙個礦結束,同時挖完這個礦中的魔法石之後,可以選擇它可繼續挖的礦之一繼續挖,但只能選擇一條。如挖完1礦後,可挖2礦,再挖5礦,6礦,……但只可以向右挖,不能回頭向左挖。請問如何挖才能挖出最多的魔法石?
輸入第一行為乙個整數n,表示有n(n≤1000)個礦。第二行為n個整數,表示這n個礦的魔法石數。隨後n行表示每個礦挖完後還能再挖哪些礦。
輸出最多挖出的魔法石數。
樣例輸入
複製樣例資料
31 1 1
1 2 3
2 33
樣例輸出
3解題思路:
我們可以用dp[
i]dp[i]
dp[i
]來表示到達i
ii號礦坑所能獲得的最大礦石數,則:
d p[
i]=m
ax(d
p[i]
,dp[
j]+n
um[i
])dp[i]=max(dp[i],dp[j]+num[i])
dp[i]=
max(
dp[i
],dp
[j]+
num[
i])j
jj代表j
jj號礦坑能從i
ii號礦坑的左部到達i
ii號礦坑
**:
//#pragma gcc optimize(3,"ofast","inline")
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue,greater>q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
ll dp[1200];
vectora[1200];
ll num[1200];
int main()
char c;
int nape=0;
int x;
for(int i=1;i<=n;i++)
else
break;
}if(nape>0&&nape!=i)
}while(c!='\n');
}rep(i,1,n)
}ll ans=0;
rep(i,1,n)
printf("%lld\n",ans);
return 0;
}
演算法競賽寶典 動態規劃 魔法石礦
題目描述 魔法石礦 mine.cpp c pas 為了找到回家的路,張琪曼施展魔法,從高維空間召喚出了一種叫作 讀者 的生物,據說 讀者 這種生物無所不能,他們可以穿越時空的限制,聆聽到歷史的聲音 巨人的吶喊。但這次 讀者 卻很嚴肅地警告她們,從遠古起就陰魂不散的天頂星人已衝破封印再次降臨到了這個空...
魔法石之戀
問題描述 在 harry potter and the sorcerer s stone 中,想得到魔法石,必須要通過許許多多的測試和遊戲。現在阿不思 鄧布利多認為這些遊戲都具有魔法力,魔法師們能夠輕鬆的通過,我們要增加一些只能夠通過智力解決的題目,需要真正的聰明人才能夠通過。現在由於我們敬愛的ha...
強聯通 魔法石
任意門 幻象群島是由n個孤立的島嶼構成。島嶼之間有一些殘破的石橋,而橋心的石墩上,就有可能鑲嵌著上古魔法石。約翰尼可以通過這些石橋,從一座島跑到另一座島,如果島上恰好有魔法石,他就可以順便收集。但是由於這些石橋實在是太殘破了,約翰尼經過之後,石橋就會崩塌,不能再次通過。由於約翰尼踩過的部分很快就會崩...