Painting the balls SGU - 183

8365 단어 dp사유
정의 dp[i][j]는 마지막 위치 i에서 두 번째 j에 대한 대가를 나타낸다. 이 복잡도는 O(n*m*m)이기 때문에 최적화가 필요하다.
이동할 때 ijk 세 개의 점을 매거하여 최적화시킨다. 실제적으로 중간에 있는 점 j가 맨 뒤에 있는 점 i를 고정시켜 앞으로 이동하는 동시에 f[j][i-m]로 최소치를 갱신하고 이 최소치도 새로운 f[i][j]를 갱신한다.
최적화 후의 복잡도는 O(n*m)이다
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define pb push_back
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define ss(str) scanf("%s",str)
#define ansn() printf("%d
",ans)
#define lansn() printf("%lld
",ans)
#define r0(i,n) for(int i=0;i #define r1(i,e) for(int i=1;i<=e;++i) #define rn(i,e) for(int i=e;i>=1;--i) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define lowbit(a) (a&(-a)) #define all(a) a.begin(),a.end() #define pii pair #define pll pair #define mp(aa,bb) make_pair(aa,bb) #define lrt rt<<1 #define rrt rt<<1|1 #define X first #define Y second #define PI (acos(-1.0)) typedef long long ll; typedef unsigned long long ull; typedef long double ld; //const ll mod = 1000000007 ; const double eps=1e-9; const int inf=0x3f3f3f3f; //const ll infl = 100000000000000000;//1e17 const int maxn= 1e5+20; const int maxm = 1e2+20; //muv[i]=(p-(p/i))*muv[p%i]%p; int in(int &ret) { char c; int sgn ; if(c=getchar(),c==EOF)return -1; while(c!='-'&&(c<'0'||c>'9'))c=getchar(); sgn = (c=='-')?-1:1; ret = (c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9')ret = ret*10+(c-'0'); ret *=sgn; return 1; } int f[maxm][maxm]; int c[maxn]; int main() { #ifdef LOCAL freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // LOCAL int n,m; sdd(n,m); r1(i,n)sd(c[i]); for(int i=1;i<=m;++i) { for(int j=1;jfor(int j=2;jint mn = inf ; for(int i = j-1+m;i>j&&i>m;--i) { mn = min(mn,f[j%maxm][(i-m)%maxm]); f[i%maxm][j%maxm] = mn + c[i]; } } int ans = inf; for(int i=n-m+1;i<=n;++i) { for(int j=i+1;j<=n;++j) ans = min(ans,f[j%maxm][i%maxm]); } ansn(); return 0; }

좋은 웹페이지 즐겨찾기