今天又模拟辣!
今天又起晚辣!
T1:
这是个模拟,所以对着大样例找规律就行了,就几行,不知道对不对。
但是找规律还是挺花时间的说,花了半个点之久(还是太菜了
T2:
最短路吧。
YbtOJ原题吧,不然我这废物怎么做得出来。
花了20分钟敲了个dijkstra,走了。
#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<vector>
#include<string>
#include<climits>
#define mp(x,y) make_pair((x),(y))
using namespace std;
typedef pair<int,int> pir;
template <typename T>
inline void read(T &x){x=0;char ch=getchar();bool f=0;while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();if(f)x=-x;}
template <typename T,typename ...Args>
inline void read(T &tmp,Args &...tmps){read(tmp);read(tmps...);}
const int N = 1e4 + 5;
struct qwq{
int dis,k,u;
bool operator <(qwq A)const{return dis > A.dis;}
qwq(int a,int b,int c):dis(a),k(b),u(c) {}
};
vector<pir>g[N];
int n,m,dis[N][12],pre[N],K,vis[N][12];
vector<int>tot;
inline void dijkstra(){
memset(dis,0x3f3f3f3f,sizeof(dis));
dis[0][K] = 0;
priority_queue<qwq>q;
q.push(qwq(0,K,0));
while(!q.empty()){
qwq tmp = q.top();q.pop();
if(vis[tmp.u][tmp.k])continue;
vis[tmp.u][tmp.k] = 1;
int u = tmp.u,k = tmp.k;
for(pir tm : g[u]){
int v = tm.first,w = tm.second;
if(dis[u][k] + w < dis[v][k]){
dis[v][k] = dis[u][k] + w;
q.push(qwq(dis[v][k],k,v));
}
if(k > 0 && dis[u][k] < dis[v][k-1]){
dis[v][k-1] = dis[u][k];
q.push(qwq(dis[v][k-1],k-1,v));
}
}
}
}
signed main(){
freopen("overwatch.in","r",stdin);
freopen("overwatch.out","w",stdout);
read(n,m,K);
for(int i=1;i<=m;++i){
int u,v,t;
read(u,v,t);
g[u].push_back(mp(v,t));
g[v].push_back(mp(u,t));
}
dijkstra();
int ans = INT_MAX;
for(int i=0;i<=K;++i)ans = min(ans,dis[n-1][i]);
printf("%d",ans);
}
T3:
哇,这题好高级的样子。
上来看了一会儿,难道是链表+贪心?
再看了一会儿,这不纯纯区间dp吗,你个**。
既然题里说了只能合并相邻两个,那么其实区间长度应该是偶数的,然后就是板子套上去。
但是!这题好像并没有那么简单,答案并不一定是 dp[1][n],因为有很多没统计的区间啊,所以我们要一个个合并上去。
嗯就这样,好像和答案解法一样,溜了溜了。
#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<vector>
#include<string>
#include<climits>
#define R register
using namespace std;
template <class T>
inline void read(T &x){x=0;char ch=getchar();bool f=0;while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();if(f)x=-x;}
template <class T,class ...Args>
inline void read(T &tmp,Args &...tmps){read(tmp);read(tmps...);}
const int N = 805;
int a[N],b[N];
int n,k;
long long dp[N][N],ans[N];
signed main(){
freopen("clash.in","r",stdin);
freopen("clash.out","w",stdout);
read(n,k);
for(R int i=1;i<=n;++i)read(a[i],b[i]);
memset(dp,-0x3f3f3f3f,sizeof(dp));
for(R int len = 2;len <= n;len += 2)
for(R int i=1;i+len-1<=n;++i){
int j = i + len - 1;
if(a[i] + a[j] <= k){
if(len != 2)
dp[i][j] = max(dp[i][j],dp[i+1][j-1] + b[i] + b[j]);
else dp[i][j] = b[i] + b[j];
}
for(R int k=i;k<j;k++){
dp[i][j] = max(dp[i][j],dp[i][k] + dp[k+1][j]);
}
//ans1 = max(ans1,dp[i][j]);
}
//不能全合并
for(R int i=2;i<=n;++i){
for(R int j=0;j<i-1;++j)
ans[i] = max(ans[i],ans[j] + dp[j+1][i]);
ans[i] = max(ans[i-1],ans[i]);
}
printf("%lld",ans[n]);
}
从思考到敲完花了一个小时多点,不过好在做出来了,ybtoj区间dp没白刷嘿嘿。
原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/245285.html