uva507 Jill Rides Again

27 篇文章 0 订阅
10 篇文章 0 订阅

简单的最大子序列问题,刘汝佳的书里有分治的解法,我用的吴大大讲的线性遍历的方法。

maxx[j]=s[j]+max{0,maxx[j-1]},就这样先遍历一遍,求出以各个车站为终点的路线的最大值,再遍历一次找打符合题意的最大值即可ac。

这种题还可以衍生出两段循环最大子段和问题。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 20100
using namespace std;

int ss[MAX],maxx[MAX],start[MAX];

int main()
{
    int t,i,j,p,s,front,rear,sum;
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        sum=0,rear=front=0;
        scanf("%d",&s);
        for(j=0;j<s-1;j++)
            scanf("%d",&ss[j]);
        maxx[0]=ss[0],start[0]=1;//二号stop
        for(p=1;p<s-1;p++)
        {
            if(maxx[p-1]>=0)
            {
                maxx[p]=maxx[p-1]+ss[p];
                start[p]=start[p-1];
            }
            else
            {
                maxx[p]=ss[p];
                start[p]=p+1;
            }
        }
        for(j=s-2;j>=0;j--)
        {
            if(maxx[j]>sum)
            {
                sum=maxx[j];
                front=start[j];
                rear=j+2;
            }
            else if(maxx[j]==sum)
            {
                if(j+2-start[j]>rear-front)
                {
                    sum=maxx[j];
                    front=start[j];
                    rear=j+2;
                }
                else if(j+2-start[j]==rear-front&&start[j]<front)
                {
                    sum=maxx[j];
                    front=start[j];
                    rear=j+2;
                }
            }
        }
        if(sum<=0)
            printf("Route %d has no nice parts\n",i);
        else
            printf("The nicest part of route %d is between stops %d and %d\n",i,front,rear);
    }
    return 0;
}


以下是改错后的代码: ```java package text6; import java.sql.*; public class customer { public static void main(String args[]) { String url = "jdbc:mysql://127.0.0.1:3306/mydatabase"; String user = "root"; String pwd = ""; Connection con = null; Statement sql = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out.print("text" + e); } try { con = DriverManager.getConnection(url, user, pwd); sql = con.createStatement(); String[] str = { "delete from customers where customerID = 'ADDIFK01'", "delete from customers where customerID = 'ALBIBB01'", "INSERT INTO customers VALUES ('ALBRDE01', 'Dave Albrechtsberger', '(508) 555-1216')", "INSERT INTO customers VALUES ('ALKAJH01', 'Jim alkan', '(832) 555-5617')", "INSERT INTO customers VALUES ('RENDE01', 'Dave Arensky', '(604) 555-5461')", "INSERT INTO customers VALUES ('AUBEJL01', 'Jill Auber', '(832) 555-8480')" }; for (int i = 0; i < str.length; i++) { int k = sql.executeUpdate(str[i]); rs = sql.executeQuery("SELECT * FROM customers"); while (rs.next()) { String number = rs.getString(1); String name = rs.getString(2); String num = rs.getString(3); System.out.println(number + "," + name + "," + num); System.out.println(); } } con.close(); } catch (SQLException ee) { System.out.print("text" + ee); } finally { try { if (rs != null) rs.close(); if (sql != null) sql.close(); if (con != null) con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 改错的部分: 1. 原代码未声明 `ResultSet`、`Connection`、`Statement` 变量,需要在开头声明并初始化为 null。 2. `for` 循环的判断条应该是 `i < str.length` 而不是 `i <= str.length`。 3. 执 SQL 语句后应该立即执查询语句获取结果集,原代码在循环结束后执查询语句,会导致只输出最后一次插入记录的结果。 4. 在处理完数据库操作后需要关闭 `ResultSet`、`Statement`、`Connection` 这三个对象,可以使用 `finally` 语句块实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值