主要的收穫是。。如何優化你遞推式裡面不必要的決策
之前的**
這個**在hdu超時了,這就對了。。這個複雜度**。。
但是這個思路非常地耿直。。那就是只需要暴力列舉刪兩個和刪三個的情況,於是就非常耿直的列舉是哪兩個n^2,是哪三個n^3
#include #include#include
#include
using
namespace
std;
intt,n,m;
int a[305],d[305
];bool f[305][305
];//
定向從左往右刪除
int dp[305][305
];int dfs(int l,int
r) }
//列舉刪三個
for(i=l;ii)
for(j=i+1;jj)
for(k=j+1;k<=r;++k)
}return dp[l][r]=p;
}void
solve()}}
for(i=l;ii)}}
}}
}}int
main()
return0;
}
我們發現了乙個列舉的方法是
在區間[l,r],要麼我們只取l,r這兩個數刪掉
要麼列舉在區間[l,r]內的分割點k,於是我們只需要考慮l,k,r這三個數能不能刪掉
注意到我們l,r是必選的。。這樣就不能形成最後一次刪掉的數字在中間
於是我們列舉l,r不是必選的情況,遞迴分成兩個子區間,將這個不選的決策交給子區間,這樣我們就發現有了這個分解的步驟
即使採用了上述前兩個策略。。憑藉只用短長度區間l,r全選和,l,k,r全選就能形成所有的決策,我認為這個想法是非常巧妙的
雖然大佬們認為可能這很顯然orz,但是不得不說這種遞迴策略非常巧妙。。可能是我還沒掌握精髓吧。。
放上1499ms/3000ms的**
細節:小心r越界,因為我的len一直列舉到n,
#include #include#include
#include
using
namespace
std;
intt,n,m;
int a[305],d[305
];bool f[305][305
];//
定向從左往右刪除
int dp[305][305
];void
solve()
for(k=l;k<=r;++k)}}
}}int
main()
return0;
}
題解 hdu5693 D Game 區間DP
題目鏈結 區間dp好題,把區間dp的基本操作都用上了。狀態轉移方程很多,見 吧 include include include includeusing namespace std const int n 310 int t,n,m,a n d,dp n n f n bool can n n map...
2D遊戲vs3D遊戲
前幾天,小李子一直在糾纏3d,偽3d遊戲等。雖說小李子效力於大公司,但是該公司畢竟不是專業的遊戲公司。美工xx等一概不全,要使用個3d引擎做個ipad,android的遊戲。這年頭是怎麼了。遊戲最主要的是什麼?是畫面?還是互動的畫面?還是互動的立體畫面?接觸過這麼多遊戲,還沒有見過只以最精緻的畫面獲...
2D遊戲vs3D遊戲
前幾天,小李子一直在糾纏3d,偽3d遊戲等。雖說小李子效力於大公司,但是該公司畢竟不是專業的遊戲公司。美工xx等一概不全,要使用個3d引擎做個ipad,android的遊戲。這年頭是怎麼了。遊戲最主要的是什麼?是畫面?還是互動的畫面?還是互動的立體畫面?接觸過這麼多遊戲,還沒有見過只以最精緻的畫面獲...