leetcode877
11879 단어 DP
leetcode877 Stone Game
사고방식: 욕심 전략이 옳지 않기 때문에 모든 상황을 열거하고 dp를 사용하여 시간의 복잡도를 낮춰야 한다. (이 문제는 수학적 해석이 있어 알렉스가 반드시 이길 수 있음을 증명한다)
alex와lee는 머리와 꼬리가 돌dp로 돌아가며 기록할 때 양쪽을 기록해야 하기 때문에 2차원 그룹 dp[left][right]이다.
[5,3,4,5]를 예로 들면 왼쪽에 [3,4,5], dp[left][right]=piles[left]+dp[left+1][right]?Lee가 가져가야 하기 때문에 이것은 옳지 않다. 나머지 [3,4,5]lee는 머리와 꼬리 중 하나를 가져가야 한다. 실제로alex는 [3,4] 또는 [4,5]에서만 선택할 수 있다. 따라서 dp[left][right]=piles[left]+max(dp[left+1][right-1], dp[left+2, right]) 오른쪽에 있는 dp[left][right]=piles[right]+max([dpleft]+1], [right-1], [right-1], [right-right]를 가져가면 [right],좌우에서 가장 큰 것을 선택하십시오: dp[left][right]=max(piles[left]+max(dp[left+1][right-1]dp[left+2,right]),piles[right]+max(dp[left+1][right-1],dp[left,right-2]).class Solution {
public:
using VV=vector<vector<int> >;
using V=vector<int>;
bool stoneGame(vector<int>& piles) {
int n=piles.size();
vector<vector<int> > dp(n,vector<int>(n,-1));
vector<int> alex(n,0);// alex pile piles alexsum
int alexsum=maxsum(dp,alex,piles,0,n-1);
int leesum=0;// piles alexsum
for(int i=0;i<n;++i){
if(!alex[i]){
leesum+=piles[i];
}
}
//cout<
if(alexsum>leesum){
return true;
}else{
return false;
}
}
int maxsum(VV& dp,V& alex,V& piles,int left,int right){
if(left>right)
return 0;
if(dp[left][right]!=-1)
return dp[left][right];
int choosel=piles[left]+max(maxsum(dp,alex,piles,left+1,right-1),maxsum(dp,alex,piles,left+2,right));
int chooser=piles[right]+max(maxsum(dp,alex,piles,left+1,right-1),maxsum(dp,alex,piles,left,right-2));
if(choosel>chooser){
alex[left]=1;
dp[left][right]=choosel;
}else{
dp[left][right]=chooser;
alex[right]=1;
}
//cout<
return dp[left][right];
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ]11048(python)
python 풀이
DP를 이용해 풀이
보통 이런 문제는 dfs나 bfs로 풀이하는 것이여서
고민을 했는데
이 문구 덕분에 DP 를 이용해 풀이할 수 있었다
뒤로 돌아가는 등의 경우를 고려하지 않아도 되기 때문이다
코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
class Solution {
public:
using VV=vector<vector<int> >;
using V=vector<int>;
bool stoneGame(vector<int>& piles) {
int n=piles.size();
vector<vector<int> > dp(n,vector<int>(n,-1));
vector<int> alex(n,0);// alex pile piles alexsum
int alexsum=maxsum(dp,alex,piles,0,n-1);
int leesum=0;// piles alexsum
for(int i=0;i<n;++i){
if(!alex[i]){
leesum+=piles[i];
}
}
//cout<
if(alexsum>leesum){
return true;
}else{
return false;
}
}
int maxsum(VV& dp,V& alex,V& piles,int left,int right){
if(left>right)
return 0;
if(dp[left][right]!=-1)
return dp[left][right];
int choosel=piles[left]+max(maxsum(dp,alex,piles,left+1,right-1),maxsum(dp,alex,piles,left+2,right));
int chooser=piles[right]+max(maxsum(dp,alex,piles,left+1,right-1),maxsum(dp,alex,piles,left,right-2));
if(choosel>chooser){
alex[left]=1;
dp[left][right]=choosel;
}else{
dp[left][right]=chooser;
alex[right]=1;
}
//cout<
return dp[left][right];
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ]11048(python)python 풀이 DP를 이용해 풀이 보통 이런 문제는 dfs나 bfs로 풀이하는 것이여서 고민을 했는데 이 문구 덕분에 DP 를 이용해 풀이할 수 있었다 뒤로 돌아가는 등의 경우를 고려하지 않아도 되기 때문이다 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.