[폭력 DP][폭력 STL] 스노우 2017 & LOJ#2256.영웅 연맹

DP 방정식fi 나열, j=min{fi -3 1, jk+k×Ci, k|j 및 k≤Ki} fi, j는 이전 i개 품목이 j중 시나리오를 생성할 때 최소 가격을 나타냅니다.
j는 매우 크고 1018이 있지만 j는 2, 3, 5, 7 세 가지 질수밖에 없기 때문에 j가 얻을 수 있는 값 상한선은 (logm)4이고 이 상한선보다 훨씬 작다.게으르기 때문에 더 이상 최적화하지 않겠습니다. DP 그룹은 맵으로 직접 저장하고 이동할 때 한 번씩 훑어봅니다.
그런데 이곳에서 10여 초를 뛰고 O2를 켜서 3초를 뛰고 T를 건네주고 마지막 점을 찍었는데...
맵이 안 되면 unordered맵, 억지로 0.5s 들어가기...
#include 
#include 
#include 
#include 
#define fi first
#define se second

using namespace std;
using namespace tr1;

typedef long long ll;

unordered_map f,g;

int n,k[210],c[210];
ll m,ans;

inline void fix(ll &x,ll y){
  if(x>y) x=y;
}

int main(){
  scanf("%d%lld
"
,&n,&m); for(int i=1;i<=n;i++) scanf("%d",&k[i]); for(int i=1;i<=n;i++) scanf("%d",&c[i]); f[0]=0; ans=1LL<<60; for(int i=1;i<=n;i++){ for(auto v : f){ if(v.fi==0){ for(int j=1;j<=k[i];j++) if(g.count(j)) fix(g[j],j*c[i]); else g[j]=j*c[i]; g[0]=0; continue; } if(g.count(v.fi)) fix(g[v.fi],v.se); else g[v.fi]=v.se; for(int j=2;j<=k[i];j++){ if(v.fi*j>=m){ fix(ans,v.se+j*c[i]); break; } if(v.se+j*c[i]>=ans) break; if(g.count(v.fi*j)) fix(g[v.fi*j],v.se+c[i]*j); else g[v.fi*j]=v.se+c[i]*j; } } swap(f,g); g.clear(); } printf("%lld
"
,ans); return 0; }

좋은 웹페이지 즐겨찾기