您的位置:首页 > 其它

2014上海全国邀请赛训练总结【7/10】

2017-07-23 16:09 309 查看
训练结果:铜.

Ac题数:5

罚时: 1071



再给我20分钟,我这E就调过了啊。。。。。。。。。。。。

A.水题。

B.

C.水Dp.题意是个大问题。

懂了题意就能Ac.

让你找一条路,上边任意一个点作为起点,下边任意一个点作为终点,使得路径总和最小,跑Dp就行了,记录路径也不难。

Ac代码:

#include <bits/stdc++.h>

using namespace std;
int a[150][150];
int dp[150][150];
int main()
{
int t;
int kase=0;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j]=0x3f3f3f3f;
if(j-1>=1&&j-1<=m)
{
if(dp[i-1][j-1]+a[i][j]<dp[i][j])
{
dp[i][j]=dp[i-1][j-1]+a[i][j];
}
}
if(j>=1&&j<=m)
{
if(dp[i-1][j]+a[i][j]<dp[i][j])
{
dp[i][j]=dp[i-1][j]+a[i][j];
}
}
if(j+1>=1&&j+1<=m)
{
if(dp[i-1][j+1]+a[i][j]<dp[i][j])
{
dp[i][j]=dp[i-1][j+1]+a[i][j];
}
}
}
}
stack<int>s;
int ans;
int output=0x3f3f3f3f;
for(int i=m;i;i--)
//        for(int i=1;i<=m;i++)
{
if(dp
[i]<output)
{
output=dp
[i];
ans=i;
}
}
s.push(ans);
int level=n;
while(level>1)
{
for(int j=1;j>=-1;j--)
{
int prepos=ans+j;
if(prepos>=1&&prepos<=m)
{
if(dp[level-1][prepos]+a[level][ans]==dp[level][ans])
{
ans=prepos;
s.push(ans);
break;
}
}
}
level--;
}
printf("Case %d\n",++kase);
int t=0;
while(!s.empty())
{
if(t)printf(" ");
int u=s.top();printf("%d",u);
s.pop();
t++;
}
printf("\n");
}
}


D.一道思维建图的二分匹配问题。我是萌萌哒D题题解

E.Bfs+状压搜索。我是萌萌哒E题题解

F.水题。

G.

H.

I.思维+拓扑排序,我是萌萌哒I题题解

J.水题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息