Dp

【アコーダーDpCバケーション】



Atcoder Dp C Vacation



Atc C
タイトルはあなたにnx yz配列を与えます
毎日1つのルールを取ることができます。
次に、dp [i] [0]はxの最初の日を表します
dp [i] [1]はy日yを表します
dp [i] [2]はzの最初の日を表します
次に、コードを転送します
最後に、dp [n] [0-2]の最大値を取ります

/* if you can't see the repay Why not just work step by step rubbish is relaxed to ljq */ #include #include #include #include #include #include #include #include #include #include #include #include using namespace std #define dbg(x) cout<<#x<<' = '<< (x)<< endl #define dbg2(x1,x2) cout<<#x1<<' = '<#define dbg3(x1,x2,x3) cout<<#x1<<' = '<#define max3(a,b,c) max(a,max(b,c)) #define min3(a,b,c) min(a,min(b,c)) #define lc (rt<<1) #define rc (rt<<11) #define mid ((l+r)>>1) typedef pair<int,int> pll typedef long long ll const int inf = 0x3f3f3f3f const int _inf = 0xc0c0c0c0 const ll INF = 0x3f3f3f3f3f3f3f3f const ll _INF = 0xc0c0c0c0c0c0c0c0 const ll mod = (int)1e9+7 ll gcd(ll a,ll b){return b?gcd(b,a%b):a} ll ksm(ll a,ll b,ll mod){int ans=1while(b){if(b&1) ans=(ans*a)%moda=(a*a)%modb>>=1}return ans} ll inv2(ll a,ll mod){return ksm(a,mod-2,mod)} void exgcd(ll a,ll b,ll &x,ll &y,ll &d){if(!b) {d = ax = 1y=0}else{exgcd(b,a%b,y,x,d)y-=x*(a/b)}}//printf('%lld*a + %lld*b = %lld ', x, y, d) const int MAX_N = 100025 ll dp[MAX_N][3] struct node { ll x,y,z }arr[MAX_N] int main() { //ios::sync_with_stdio(false) //freopen('a.txt','r',stdin) //freopen('b.txt','w',stdout) int nscanf('%d',&n) for(int i = 1i<=n++i) scanf('%lld%lld%lld',&arr[i].x,&arr[i].y,&arr[i].z) dp[1][0] = arr[1].x,dp[1][1] =arr[1].y,dp[1][2] = arr[1].z for(int i = 2i<=n++i) dp[i][0] = max(dp[i-1][1],dp[i-1][2])+arr[i].x,dp[i][1] = max(dp[i-1][0],dp[i-1][2])+arr[i].y,dp[i][2] = max(dp[i-1][0],dp[i-1][1])+arr[i].z printf('%lld ',max(dp[n][0],max(dp[n][1],dp[n][2]))) //fclose(stdin) //fclose(stdout) //cout << 'time: ' << (long long)clock() * 1000 / CLOCKS_PER_SEC << ' ms' << endl return 0 }