Untitled
unknown
c_cpp
6 months ago
1.9 kB
3
Indexable
#include<bits/stdc++.h> #define ll long long const double dt = 0.5; const double dx = 0.125; const double du = 1; const double dv = du*dt; const double tmax = 40; const double xmax = 100; const double umin = -7; const double umax = 0; const double vmax = 15; using namespace std; double J[90][35][807]; pair<int,int> back[90][35][561]; double phi(double v1, double u) { return u*dt*(v1+0.5*u*dt); } double beta(int k) { return 1-dt/(tmax-k*dt); } int main() { ios_base::sync_with_stdio(false); cin.tie(0);cout.tie(0); vector<double>v,x,u; for(double i=0;i<=vmax;i+=dv) v.push_back(i); for(double i=umin;i<=umax;i+=du) u.push_back(i); for(double i=0;i<=xmax;i+=dx) x.push_back(i); int n=tmax/dt-1; for(int i=0;i<v.size();i++) { for(int j=0;j<x.size();j++) { if(j==0) J[n][i][j]=0; else J[n][i][j]=INT_MAX; } } double newj=0; for(int k=n-1;k>=0;k--) { for(int j=0;j<x.size();j++) { for(int i=0;i<v.size();i++) { J[k][i][j]=INT_MAX; for(double a=umin;a<=umax;a+=du) { if(x[j]-0.5*dt*dt*a+v[i]*dt < 0 || v[i]+a*dt < dv || v[i]+a*dt>vmax || x[j]>71)continue; newj=J[k+1][(int)((v[i]+a*dt)/dv)][(int)((x[j]-0.5*dt*dt*a-v[i]*dt)/dx)]*beta(k)+phi(v[i],a); if(J[k][i][j]>newj) { J[k][i][j]=newj; back[k][i][j]=make_pair((v[i]+a*dt)/dv,(x[j]-0.5*dt*dt*a-v[i]*dt)/dx); } } } } } cout<<J[0][18][560]<<endl; pair<int,int>p=make_pair(18,560); for(int i=0;i<n;i++) { cout<<v[p.first]<<"\n"<<x[p.second]<<"\n---\n"; p=back[i][p.first][p.second]; } }
Editor is loading...
Leave a Comment